有没有一种方法可以用一些东西替换字符串中第一个字符的实例。只替换字符的第n个实例
^1402 WSN NIAMLAB^teertS htimS 005
是
&1402 WSN NIAMLAB^teertS htimS 005
保持第二^到位
有没有一种方法可以用一些东西替换字符串中第一个字符的实例。只替换字符的第n个实例
^1402 WSN NIAMLAB^teertS htimS 005
是
&1402 WSN NIAMLAB^teertS htimS 005
保持第二^到位
只是第二^
替换要替换字符的第一个实例,我会建议使用的STUFF
和CHARINDEX
功能。 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>
未经测试的代码:
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
尽管在你的问题中的例子是如何替换一个字符的第一个发生,你的标题表明你想替换第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])
这个例子与$
你问了很多问题,人们已经回答了你。请通过告诉我们哪些答案适用于您做出贡献。对于您的每个问题,请勾选其中一个答案。 – 2012-01-13 04:38:13