我只需要从Postgres中的字符串'[1,11, 1, 111,12,1,11]'中删除元素1,而不影响其他元素。符号11和111,12不应该受到影响。最终结果应该是字符串'[11,111,12,11]'我尝试了不同的替换选项REPLACE(%s,' 1,',''),REPLACE(%s,'1 ,','')。
'[1,11, 1, 111,12,1,11]'
1
11
111
12
'[11,111,12,11]'
REPLACE(%s,' 1,','')
REPLACE(%s,'1 ,','')
eblbsuwk1#
由内而外:首先用{和}替换[和],以获得正确的数组语法,然后将结果字符串转换为文本数组,并将其转换为unnest字符串表。选择不等于“1”的元素,将结果集聚合回字符串,并将其格式化在方括号内。
{
}
[
]
unnest
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
pexxcrt22#
该字符串是一个有效的jsonb数组文字,因此您可以使用jsonpath,然后将其转换回text。它在返回的过程中在每个逗号后添加统一的间距。Demo at db<>fiddle:
jsonb
jsonpath
text
select jsonb_path_query_array('[1,11, 1, 111,12,1,11]'::jsonb,'$?(@<>1)')::text;
字符串你也可以把它变成一个常规的数组字面量,使用array_remove(),然后转换回来,这会删除逗号分隔符后面的空格:
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单词字符类的使用使它也可以处理不仅仅由数字组成的元素。
' 111'
\w
2条答案
按热度按时间eblbsuwk1#
由内而外:首先用
{
和}
替换[
和]
,以获得正确的数组语法,然后将结果字符串转换为文本数组,并将其转换为unnest
字符串表。选择不等于“1”的元素,将结果集聚合回字符串,并将其格式化在方括号内。字符串
DB-Fiddle
pexxcrt22#
该字符串是一个有效的
jsonb
数组文字,因此您可以使用jsonpath
,然后将其转换回text
。它在返回的过程中在每个逗号后添加统一的间距。Demo at db<>fiddle:字符串
你也可以把它变成一个常规的数组字面量,使用
array_remove()
,然后转换回来,这会删除逗号分隔符后面的空格:型
当然,有一种方法可以完全在
text
中实现:型
保持原来的间距,不添加或删除任何不属于被删除元素的槽的东西,如果它很重要的话。例如
' 111'
将保持它的前导空格。\w
单词字符类的使用使它也可以处理不仅仅由数字组成的元素。