Có cách nào có thể thay thế phiên bản đầu tiên của một ký tự trong chuỗi có ví dụ như không.Chỉ thay thế thể hiện thứ n của ký tự
^1402 WSN NIAMLAB^teertS htimS 005
là
&1402 WSN NIAMLAB^teertS htimS 005
giữ thứ hai^tại chỗ
Có cách nào có thể thay thế phiên bản đầu tiên của một ký tự trong chuỗi có ví dụ như không.Chỉ thay thế thể hiện thứ n của ký tự
^1402 WSN NIAMLAB^teertS htimS 005
là
&1402 WSN NIAMLAB^teertS htimS 005
giữ thứ hai^tại chỗ
Để thay thế các trường hợp đầu tiên của một nhân vật tôi muốn giới thiệu việc sử dụng các chức năng STUFF
và CHARINDEX
. STUFF
chèn một chuỗi vào một chuỗi khác. Nó xóa một độ dài được chỉ định của các ký tự trong chuỗi đầu tiên ở vị trí bắt đầu và sau đó chèn chuỗi thứ hai vào chuỗi đầu tiên ở vị trí bắt đầu.
DECLARE @str varchar(100) = '^1402 WSN NIAMLAB^teertS htimS 005'
SELECT STUFF(@str, CHARINDEX('^', @str), 1, '&')
Lưu ý rằng bạn cũng có thể sử dụng STUFF
trong một truy vấn như sau:
SELECT STUFF(<yourcolumn>, CHARINDEX('^', <yourcolumn>), 1, '&')
FROM <yourtable>
đang chưa được kiểm tra:
SELECT STUFF('^1402 WSN NIAMLAB^teertS htimS 005', charindex('^', '^1402 WSN NIAMLAB^teertS htimS 005'), 1, '&');
GO
Tuy nhiên, nếu nhân vật không tồn tại, bạn sẽ muốn bao quanh với một/sau đó trên charindex('^', '^1402 WSN NIAMLAB^teertS htimS 005') != 0
Mặc dù ví dụ trong câu hỏi của bạn là làm thế nào để thay thế chỉ xuất hiện lần đầu tiên của một char, tiêu đề của bạn cho thấy bạn muốn thay thế sự xuất hiện thứ n đó là một chút phức tạp hơn.
Tôi đã viết một hàm một lúc để tìm sự xuất hiện thứ n của một ký tự trong một chuỗi. Bạn có thể sử dụng hơn để xây dựng một chuỗi với SUBSTRING.
if exists (
select 1
from dbo.sysobjects
where id = object_id(N'[dbo].[CHARINDEX3]')
and xtype in (N'FN', N'IF', N'TF'))
begin
drop function [dbo].[CHARINDEX3]
end
GO
/*
Example:
SELECT dbo.CHARINDEX3('a', 'abb abb a', 3)
SELECT dbo.CHARINDEX3('b', 'abb abb a', 5)
SELECT dbo.CHARINDEX3('a', 'abbabba', 3)
SELECT dbo.CHARINDEX3('b', 'abbabba', 5)
If @occurance > the max Occurrence, the function will return the max Occurrence
*/
CREATE FUNCTION dbo.CHARINDEX3
(
@TargetStr char(1),
@SearchedStr varchar(max),
@Occurrence int
)
RETURNS INT
AS
BEGIN
DECLARE @ret INT
; WITH
-- Tally table Gen Tally Rows: X2 X3
t1 AS (SELECT 1 N UNION ALL SELECT 1 N), -- 4 , 8
t2 AS (SELECT 1 N FROM t1 x, t1 y), -- 16 , 64
t3 AS (SELECT 1 N FROM t2 x, t2 y), -- 256 , 4096
t4 AS (SELECT 1 N FROM t3 x, t3 y), -- 65536 , 16,777,216
t5 AS (SELECT 1 N FROM t4 x, t4 y), -- 4,294,967,296, A lot
Numbers AS (SELECT ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) Num
FROM t3 x, t3 y)
SELECT TOP 1 @ret = Num
FROM
(
SELECT Ident = ROW_NUMBER() OVER (ORDER BY N.Num), N.Num
FROM Numbers N
WHERE N.Num <= DATALENGTH(@SearchedStr)
AND SUBSTRING(@SearchedStr, N.Num, DATALENGTH(@TargetStr)) = @TargetStr
) R
WHERE Ident <= @Occurrence
ORDER BY Ident DESC
RETURN @ret
END
GO
Sử dụng chức năng đó bạn có thể lấy vị trí của lần xuất hiện thứ ba và chỉ cần kéo tất cả ký tự trước và sau khi xảy ra, thay thế giá trị cụ thể.
--Actual Code
DECLARE @loc INT
DECLARE @MyStr VARCHAR(200)
DECLARE @replacement CHAR(1)
SET @MySTr = '^1402 WSN NIAMLAB^teertS htimS 005'
SET @replacement = '$'
SELECT @loc = dbo.CHARINDEX3('^',@MyStr, 2)
SELECT SUBSTRING(@myStr, 1, @loc-1) + @replacement + SUBSTRING(@MyStr, @loc + 1, LEN(@MyStr)[email protected])
Ví dụ này chỉ là 2 ^
thay thế với $
Bạn đã đặt nhiều câu hỏi, người ta đã trả lời bạn. Hãy đóng góp bằng cách cho chúng tôi biết câu trả lời nào phù hợp với bạn. Đối với mỗi câu hỏi trong quá khứ của bạn, hãy chọn một trong các câu trả lời. –