我有一个字段(字符类型不同),称为' directedlink_href'在一个包含数组的表中,这些数组的所有值都以'#'开头。字符。
我如何删除'#'此字段中这些数组中任何条目的字符?
例如......
{#osgb4000000030451486,#osgb4000000030451491}
到
{osgb4000000030451486,osgb4000000030451491}
答案 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__');