在Postgresql中提取字符串并删除空/空元素

在Postgresql中提取字符串并删除空/空元素,sql,postgresql,Sql,Postgresql,我需要用Postgresql从字符串中提取值 但是对于我的特殊场景——如果一个元素值为null,我想删除它并使下一个元素1索引更接近 e.g. assume my string is: "a$$b" 如果我会使用 select string_to_array('a$$b','$') 结果是: {a,,b} 如果我努力 SELECT unnest(string_to_array('a__b___d_','_')) EXCEPT SELECT '' 它改变了顺序 1.d 2.a 3.b

我需要用Postgresql从字符串中提取值 但是对于我的特殊场景——如果一个元素值为null,我想删除它并使下一个元素1索引更接近

e.g. 
 assume my string is: "a$$b"
如果我会使用

select string_to_array('a$$b','$')
结果是:

{a,,b}
如果我努力

SELECT unnest(string_to_array('a__b___d_','_')) EXCEPT SELECT ''
它改变了顺序

1.d
2.a
3.b
订单改变了,这对我不好

我找到了另一个解决方案,包括:

select array_remove( string_to_array(a||','||b||','||c,',') , '')
from (
select
split_part('a__b','_',1) a,
split_part('a__b','_',2) b,
split_part('a__b','_',3) c
)  inn
返回

{a,b}
然后从数组中,我需要按索引提取值 e、 g.
提取(数组,2)


但在我看来,这一条似乎有些过分——有更好的或更简单的方法可供使用吗?

您可以使用带有顺序性的
在取消测试期间保留索引信息:

select a.c
from unnest(string_to_array('a__b___d_','_')) with ordinality as a(c,idx)
where nullif(trim(c), '') is not null
order by idx;
如果要将其作为数组返回:

select array_agg(a.c order by a.idx)
from unnest(string_to_array('a__b___d_','_')) with ordinality as a(c,idx)
where nullif(trim(c), '') is not null;