如何使用SQL从包含多个值(每个值由逗号分隔)的列中选择性地删除特定值



例如,考虑如下表(table name=accounts)

account        owner_ids
PA account     sa123,rt458,hf678,de348f
RA account     gg678n,fk980,rt458,hf678

在这里,我想从整个表中删除owner_ids "rt458" and "hf678",删除逗号后应该是完美的(我的意思是,删除后,剩余的所有者ID应该像以前一样用逗号分隔,列中不应该有任何不必要的逗号(

任何形式的帮助都很感激,帮我吧,伙计们

您可以使用REPLACE函数两次:

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

REPLACE每次出现search_string时都返回char,并用replacement_string替换。

或者您可以使用REGEXP_REPLACE通过regex:替换/删除这些值

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,');

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

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

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

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

稍后删除开头和结尾的逗号,我们添加这些逗号以使结构统一。

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

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

最新更新