2012-01-13 51 views
6

有沒有一種方法可以用一些東西替換字符串中第一個字符的實例。只替換字符的第n個實例

^1402 WSN NIAMLAB^teertS htimS 005 

&1402 WSN NIAMLAB^teertS htimS 005 

保持第二^到位

+3

你問了很多問題,人們已經回答了你。請通過告訴我們哪些答案適用於您做出貢獻。對於您的每個問題,請勾選其中一個答案。 – 2012-01-13 04:38:13

回答

21

只是第二^替換要替換字符的第一個實例,我會建議使用的STUFFCHARINDEX功能。 STUFF將字符串插入另一個字符串。它會刪除開始位置第一個字符串中的指定長度的字符,然後將第二個字符串插入到開始位置的第一個字符串中。

DECLARE @str varchar(100) = '^1402 WSN NIAMLAB^teertS htimS 005' 
SELECT STUFF(@str, CHARINDEX('^', @str), 1, '&') 

請注意,您還可以在查詢中使用STUFF如下:

SELECT STUFF(<yourcolumn>, CHARINDEX('^', <yourcolumn>), 1, '&') 
FROM <yourtable> 
0

未經測試的代碼:

SELECT STUFF('^1402 WSN NIAMLAB^teertS htimS 005', charindex('^', '^1402 WSN NIAMLAB^teertS htimS 005'), 1, '&'); 
GO 

但是,如果角色不存在,你會想周圍用if/then表示charindex('^', '^1402 WSN NIAMLAB^teertS htimS 005') != 0

2

儘管在你的問題中的例子是如何替換一個字符的第一個發生,你的標題表明你想替換第n個發生有點棘手。

我寫了一個函數,回來找到字符串中第n個字符的出現。你可以用比使用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 

使用該功能,你可以得到第n一次出現的位置,並簡單地把所有的字符之前和之後一次出現,取代了具體的值。

--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]) 

這個例子與$

相關問題