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



我想咨询一下从表中每一行的varchar字段中删除某个子字符串的最佳方法。假设我有一个单列表,列名为"user_list",它是一个varchar字段,包含用";"分隔的用户名。例如:
第1排:詹姆斯;大卫;摩西
第二排:玛丽;摩西;毛圈布
第三排:罗纳尔多;梅西;zlatan

无论如何,这些列表都没有排序。我想装箱一个获得用户名的SP,并将其从出现的每一行中删除,例如,如果数据库是上面的例子,并且我得到了一个输入"摩西"我希望它看起来像第1排:詹姆斯;大卫
第二排:玛丽;毛圈布
第三排:罗纳尔多;梅西;zlatan

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

谢谢!

您的数据结构非常糟糕。SQL具有存储事物列表的良好结构。它被称为"桌子"。特别是,您需要一个连接表,而不是将值存储为列表。

也就是说,你不能总是控制数据的结构。以下内容应该会有所帮助:

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 + ';%';

好的,所以我采纳了Gordon的建议,为了解决我遇到的问题(可以在评论中看到),我做了以下事情(我一开始是怎么不考虑的?:()

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

最新更新