在PostgreSQL中从类似数组的字符串中删除特定元素

1tuwyuhd  于 2023-11-18  发布在  PostgreSQL
关注(0)|答案(2)|浏览(204)

我只需要从Postgres中的字符串'[1,11, 1, 111,12,1,11]'中删除元素1,而不影响其他元素。符号1111112不应该受到影响。
最终结果应该是字符串'[11,111,12,11]'
我尝试了不同的替换选项REPLACE(%s,' 1,','')REPLACE(%s,'1 ,','')

eblbsuwk

eblbsuwk1#

由内而外:首先用{}替换[],以获得正确的数组语法,然后将结果字符串转换为文本数组,并将其转换为unnest字符串表。选择不等于“1”的元素,将结果集聚合回字符串,并将其格式化在方括号内。

select format('[%s]', string_agg(e, ','))
from unnest(replace(replace('[1,11, 1, 111,12,1,11]','[','{'),']','}')::text[]) e
where not e = '1';

字符串
DB-Fiddle

pexxcrt2

pexxcrt22#

该字符串是一个有效的jsonb数组文字,因此您可以使用jsonpath,然后将其转换回text。它在返回的过程中在每个逗号后添加统一的间距。Demo at db<>fiddle:

select jsonb_path_query_array('[1,11, 1, 111,12,1,11]'::jsonb,'$?(@<>1)')::text;

字符串
你也可以把它变成一个常规的数组字面量,使用array_remove(),然后转换回来,这会删除逗号分隔符后面的空格:

select translate(array_remove(translate('[1,11, 1, 111,12,1,11]','[]','{}')::int[]
                              ,1)::text,'{}','[]');


当然,有一种方法可以完全在text中实现:

select replace(regexp_replace(replace('[1,11, 1, 111,12,1,11]',    ',' ,']['),
                                      '\[[^\w]*1[^\w]*\]','',1,0), '][',',' )


保持原来的间距,不添加或删除任何不属于被删除元素的槽的东西,如果它很重要的话。例如' 111'将保持它的前导空格。\w单词字符类的使用使它也可以处理不仅仅由数字组成的元素。

相关问题