我有这样的列表存储在SQL中的字段中:
Id MyListField
1 soy, meat, milk, wheat, nuts
2 soy, meat, nuts, milk, wheat
3 nuts
4 walnuts, nutshell, nuts
5 nuts, beans
6 walnuts, hazel nuts
7 nutshell, nutsize
这没有规范化,我无法更改。我现在必须找到nuts
并将其替换为insane
(但请保留{{1} }和hazel nuts
)。
查找相对简单,有四种情况,我可以使用占位符nutshell
:
%
但是替换很难,因为我没有占位符或startofstring / endofstring字符:
SELECT * FROM MyTable WHERE
MyListField LIKE 'nuts' OR
MyListField LIKE 'nuts, %' OR
MyListField LIKE '%, nuts' OR
MyListField LIKE '%, nuts, %'
我可以轻松地在字符串的中间替换它,但不能在开头或结尾处替换它。或者我可以吗?
我正在使用SQL Server 2008,如果这很重要。
答案 0 :(得分:2)
如果您在,
和_,
之间连接字段,那么您只需要查找一个案例。
e.g。
update MyTable set MyFieldList = replace(', ' + MyFieldList + ',', ', nuts,', ', insane,')
update MyTable set MyFieldList = substring(MyFieldList, 3, len(MyFieldList) - 3)
答案 1 :(得分:2)
通过在列表的开头和结尾添加一个逗号,每个元素都包含在一个前导","和尾随","。
然后你的替换方法变得容易....
REPLACE(', ' + MyListField + ',',
', ' + @termToReplace + ',',
', ' + @replacement + ',')
最后,删除前导和尾随逗号。
答案 2 :(得分:0)
您可以使用类似
的内容case
when Field = @val then @replaceVal
when Field like @val + ', %' then
@replaceVal + substring(Field, len(@val) + 1, len(Field))
when Field like '%, ' + @val then
left(Field, len(Field) - len(@val)) + @replaceVal
只需添加所有剩余选项,您就可以了。
答案 3 :(得分:0)
有了这些帮助,它比我想象的要容易。
UPDATE MyTable
SET MyListField =
SUBSTRING(
REPLACE(
CONCAT(', ', MyListField, ', '),
', nuts, ',
', insane, '
),
3,
DATALENGTH(MyListField)+LEN('insane')-LEN('nuts')
)
WHERE CONCAT(', ',MyListField,', ') LIKE '%, nuts, %'
只要字符串中出现一个或零个,就可以正常工作。如果有多个,它会失败,但这对我来说无关紧要。如果对您很重要,请随意将(LEN-LEN)部分与How do you count the number of occurrences of a certain substring in a SQL varchar?
相乘