在逗号分隔列表中查找值

时间:2015-07-09 15:17:28

标签: sql sql-server sql-server-2008

我有这样的列表存储在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,如果这很重要。

4 个答案:

答案 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?

相乘