如何使用SQL从包含多个值的列中有选择地删除一个特定值,每个值之间用逗号隔开?

时间:2018-11-11 07:05:45

标签: mysql sql database oracle plsql

例如,考虑如下表格(scp -o "ForwardAgent yes"

table name=accounts)

在这里,我想从整个表中删除account owner_ids PA account sa123,rt458,hf678,de348f RA account gg678n,fk980,rt458,hf678 ,并且删除逗号后应该是完美的(我的意思是在删除之后,其余的owner_id也应像以前一样用逗号分隔,并且不应有任何不必要的逗号在该列中)

感谢您的帮助,

2 个答案:

答案 0 :(得分:0)

您可以两次使用REPLACE功能:

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

REPLACE在每次出现search_string并替换为replace_string的情况下返回char。

或者您可以使用REGEXP_REPLACE通过正则表达式替换/删除这些值:

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

REGEXP_REPLACE通过允许您在字符串中搜索正则表达式模式来扩展REPLACE函数的功能。

要支持rt458是CSV列表中第一个条目的情况(如@TimBiegeleisen所评论),您必须不允许使用逗号,例如:

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

使用替换,您需要拨打两次电话:

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

您还可以看到other solutions从逗号分隔的字符串中删除值

答案 1 :(得分:0)

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

首先在字段前面加上逗号CONCAT(',', owner_ids, ','),以使其统一。

然后,从其中删除,rt458,,hf678,

此后,我们在开头和结尾处都删除了逗号,以使结构统一。

这将在值之间保持单个逗号。

  

请注意,您应该更喜欢对owner_ids进行规范化处理,以便于处理此类更新。