从PostgreSQL表中的数组中删除#个字符?

时间:2016-11-07 16:05:16

标签: sql arrays postgresql

我有一个字段(字符类型不同),称为' directedlink_href'在一个包含数组的表中,这些数组的所有值都以'#'开头。字符。

我如何删除'#'此字段中这些数组中任何条目的字符?

例如......

{#osgb4000000030451486,#osgb4000000030451491}

{osgb4000000030451486,osgb4000000030451491}

3 个答案:

答案 0 :(得分:3)

干净的解决方案是取消,替换然后重新聚合值:

select id, 
       (select array_agg(substr(x.val,2) order by x.idx) from unnest(t1.directedlink_href) with ordinality as x(val,idx)) as data
from the_table t1;

如果您想实际更改表格中的数据:

update the_table t1
  set directedlink_href = (select array_agg(substr(x.val,2) order by x.idx) from unnest(t1.directedlink_href) with ordinality as x(val,idx));

这简单地剥离了第一个角色。如果您可能在值的开头有其他字符,则需要使用regexp_replace(x.val,'^#', '')而不是substr(x.val,2)

答案 1 :(得分:1)

@a_horse_with_no_name得到了我的支持,以获得更清洁,更“Posgres-ish”的解决方案。
我即将删除这个答案,但经过一些测试后,这个解决方案似乎具有优势 因此,我会在这里留下这个解决方案,但我建议选择@a_horse_with_no_name的解决方案作为正确答案。

我正在使用chr(1)有一个很可能没有出现在数组元素中的字符。

select  string_to_array(substr(replace(array_to_string(directedlink_href,chr(1)),chr(1)||'#',chr(1)),2),chr(1))

from    t
;

答案 2 :(得分:0)

认为这是一个更简单,更通用的解决方案,我想分享一下:

SELECT regexp_split_to_array(regexp_replace(array_to_string(ARRAY['#osgb4000000030451486','#osgb4000000030451491'], '__DELIMITER__'), '#', '', 'g'), '__DELIMITER__');