2012-01-13 35 views
6

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 

&1402 WSN NIAMLAB^teertS htimS 005 

giữ thứ hai^tại chỗ

+3

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. –

Trả lời

21

Để 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 STUFFCHARINDEX. 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> 
0

đ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

2

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 $

Các vấn đề liên quan