从表的多行中删除varchar字段中的子字符串

时间:2014-09-24 10:43:44

标签: sql sql-server

我想咨询一下从表中每行的varchar字段中删除某个子字符串的最佳方法。 假设我有一个列表,列名是" user_list"它是一个varchar字段,包含由";"分隔的用户名。 例如:
第1行:詹姆斯;大卫;摩西
第2行:玛丽;摩西;特里
第3行:罗纳尔多;梅西;兹拉坦

无论如何,列表都没有排序。 我想创建一个获取用户名的SP并将其从显示的每一行中删除, 例如,如果数据库是上面的例子,我得到了一个输入' moses' 我希望它看起来像 第1行:詹姆斯;大卫;
row2:mary; terry
第3行:罗纳尔多;梅西;兹拉坦

我希望它是一个单独的更新命令,而不是光标,我想和自己(现在和你一起)思考最好的方法是什么。

谢谢!

2 个答案:

答案 0 :(得分:2)

您的数据结构非常糟糕。 SQL有一个很好的结构来存储事物列表。它被称为" table"。特别是,您需要一个联结表而不是将值存储为列表。

也就是说,您无法始终控制数据的结构。以下内容应该有所帮助:

update table t
    set usernames = replace(replace(';' + usernames + ';', ';' + @UserName + ';', ''), ';;', ';')
    where ';' + usernames + ';' like '%;' + @UserName + ';%';

这将在列表的开头和结尾添加分号。如果这是一个问题,您可以使用left()stuff()删除它们。

编辑:

要删除开头的;,请使用stuff()

update table t
    set usernames = stuff(replace(replace(';' + usernames + ';', ';' + @UserName + ';', ''), ';;', ';'), 1, 1, '')
    where ';' + usernames + ';' like '%;' + @UserName + ';%';

答案 1 :(得分:0)

好的,所以我接受了戈登所建议的并解决了我遇到的问题(可以在评论中看到)我做了以下(我怎么不首先考虑它?:()

update matan_test 
SET usernames= replace(replace(mail_list,@UserName+';', ''), @UserName, '')
where usernames like '%'+@UserName+'%';