我想咨询一下从表中每行的varchar字段中删除某个子字符串的最佳方法。
假设我有一个列表,列名是" user_list"它是一个varchar字段,包含由";"分隔的用户名。
例如:
第1行:詹姆斯;大卫;摩西
第2行:玛丽;摩西;特里
第3行:罗纳尔多;梅西;兹拉坦
我希望它是一个单独的更新命令,而不是光标,我想和自己(现在和你一起)思考最好的方法是什么。
谢谢!
答案 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+'%';