mysql—如何使用sql有选择地从包含多个值的列中删除特定值,每个值用逗号分隔?

hmmo2u0o  于 2021-06-18  发布在  Mysql
关注(0)|答案(2)|浏览(484)

例如,考虑下面这样一个表( table name=accounts) ```
account owner_ids
PA account sa123,rt458,hf678,de348f
RA account gg678n,fk980,rt458,hf678

这里,我要删除 `owner_ids "rt458" and "hf678"` 从整个表中删除逗号后,逗号应该是完美的(我的意思是删除后,其余的所有者标识也应该像以前一样用逗号分隔,列中不应该有任何不必要的逗号)
谢谢你的帮助,帮帮我,伙计们
jvlzgdj9

jvlzgdj91#

UPDATE accounts
SET owner_ids = TRIM(BOTH ',' FROM
    REPLACE(REPLACE(CONCAT(',', owner_ids, ','), ',rt458,', ''), ',hf678,', '')
);

首先在字段前面加上逗号 CONCAT(',', owner_ids, ',') 使之统一。
然后,移除 ,rt458, 以及 ,hf678, 从它那里。
后来去掉开头和结尾的逗号,我们添加了逗号以使结构统一。
这将在值之间保留一个逗号。
请注意,您应该更喜欢标准化 owner_ids 因此,这样的更新很容易处理。

gtlvzcf8

gtlvzcf82#

您可以使用replace函数两次:

update accounts 
set owner_ids = REPLACE(REPLACE(owner_ids,
             ',rt458' ),',hf678');

replace返回char,每次出现的搜索字符串都替换为替换字符串。
或者可以使用regexp\u replace替换/删除regex中的值:

update accounts 
set owner_ids = REGEXP_REPLACE(owner_ids,
             '(\,rt458||\,hf678)', '');

regexp\u replace通过让您在字符串中搜索正则表达式模式来扩展replace函数的功能。
要支持rt458是csv列表中第一个条目的情况(如@timbiegeleisen所评论的),您必须不允许使用逗号,因为:

update accounts 
set owner_ids = REGEXP_REPLACE(owner_ids,
             '(\,{0,1}rt458||\,{0,1}hf678)', '');

使用replace时,您需要进行两次呼叫:

update accounts 
set owner_ids = REPLACE(REPLACE(REPLACE(REPLACE(owner_ids,
             ',rt458' ),',hf678', 'rt458,', 'hf678,');

您还可以看到其他从逗号分隔的字符串中删除值的解决方案

相关问题