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

Sql 从表的多行中删除varchar字段中的子字符串,sql,sql-server,Sql,Sql Server,我想咨询一下从表中每一行的varchar字段中删除某个子字符串的最佳方法。 假设我有一个单列表,列名是“user_list”,它是一个varchar字段,包含以“;”分隔的用户名。 例如: 第1行:詹姆斯;大卫;摩西 第二行:玛丽;摩西;特里 第三排:罗纳尔多;梅西;兹拉坦 无论如何,列表都没有排序。 我想包装一个SP,该SP获取用户名,并将其从每一行中删除, 例如,如果db是上面的例子,我得到了一个输入'moses' 我希望它看起来像 第1行:詹姆斯;大卫 第二行:玛丽;特里 第三排:罗纳尔多

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

无论如何,列表都没有排序。 我想包装一个SP,该SP获取用户名,并将其从每一行中删除, 例如,如果db是上面的例子,我得到了一个输入'moses' 我希望它看起来像 第1行:詹姆斯;大卫
第二行:玛丽;特里
第三排:罗纳尔多;梅西;兹拉坦

我希望它是一个单一的更新命令,而不是一个光标,我正在和我自己(现在和你一起)思考什么是最好的方式来做这件事


谢谢

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

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

update table t
    set usernames = replace(replace(';' + usernames + ';', ';' + @UserName + ';', ''), ';;', ';')
    where ';' + usernames + ';' like '%;' + @UserName + ';%';
这将在列表的开头和结尾放一个分号。如果这是一个问题,您可以使用
left()
stuff()
删除它们

编辑:

删除
在开始时,使用
stuff()


好吧,我采纳了戈登的建议,为了解决我遇到的问题(从评论中可以看出),我做了以下几件事(一开始我怎么没有想到这件事?:()


首先,谢谢你,但在你的解决方案中,你不认为总是有“;”在用户名之前?因为如果他是列表中的第一个,用户名前缀不包含“;”@matansab,这就是为什么Gordon将
连接到用户名字段的开头和结尾。每次引用
用户名时,你都会看到它实际上是-
;“+usernames+”;
,因此开头总是有一个分号。此外,无法强调您需要多快的速度才能摆脱此表结构。您好,它工作正常,现在在Garth解释之后,我了解它的作用,但问题是,在字段的开头,它以“;”它不应该是那样的。我试图删除它,但如果你有一个快速的想法,它将是有帮助的我的意思是,左或东西没有帮助我,因为只有在完全替换发生后,我才知道varchar的LEN,我不能与他们结合,对吗?
update table t
    set usernames = stuff(replace(replace(';' + usernames + ';', ';' + @UserName + ';', ''), ';;', ';'), 1, 1, '')
    where ';' + usernames + ';' like '%;' + @UserName + ';%';
update matan_test 
SET usernames= replace(replace(mail_list,@UserName+';', ''), @UserName, '')
where usernames like '%'+@UserName+'%';