替换SQL

时间:2016-12-08 09:11:40

标签: sql tsql

我收到了数千个包含数据的字符串,并且标识有'@xx'的id。如果字符串有'|'它表示有更多带有ID的数据。

如何查找并替换包含特定ID的所有ID?如果我想将@ 1更改为@ 24,我不希望将@ 11更改为@ 241

具有预期输出的一些示例

21600-39600@1 -> 21600-39600@24 
21600-39600@2 -> 21600-39600@2
21600-39600@7|39600-52200@11|68000-72200@1 -> 21600-39600@7|39600-52200@11|68000-72200@24

替换(列,'@ 1','@ 24')不起作用,因为@ 11将更改为@ 241。所以我需要知道它是否是字符串的结尾或者是否以“|”

结尾

2 个答案:

答案 0 :(得分:2)

又快又脏,但你可以这样做:

-- Update the end bits
UPDATE table
SET field = LEFT('field', LEN('field') -2) + '@24'
WHERE field LIKE '%@1';

-- Update the in between bits
UPDATE table
SET field = REPLACE(field, '@1|', '@24|')
WHERE field LIKE '%@1|%'; -- This where statement is optional due to the nature of the REPLACE.

否则你将不得不关注REGEX的神奇世界。如果这是你想要不止一次运行的东西,我肯定会考虑到这一点。如果这只是一次性修复,那么。这是星期四,我称之为有效的借口。

答案 1 :(得分:1)

试试这个

declare @t table(col varchar(100))
insert into @t 
select '21600-39600@1' union all
select '21600-39600@2' union all
select '21600-39600@7|39600-52200@11|68000-72200@1'


select col,case when new_col like '%|' then 
               substring(new_col,1,len(new_col)-1) 
            else 
                 new_col end as new_col 
from
(
select col,
case when col+'|' like '%@1|%' then 
Replace(col+'|', '@1|', '@24|') else col end as new_col 
from @t
) as t

结果

col                                            new_col
---------------------------------------------  ------------
21600-39600@1                                 21600-39600@24
21600-39600@2                                 21600-39600@2
21600-39600@7|39600-52200@11|68000-72200@1    21600-39600@7|39600-52200@11|68000-72200@24