我有一个文本项数组,数组中的每个文本项都是定界字符串,这是一个示例:
drop table if exists tmp;
create table tmp(x text);
insert into tmp select ('1~41.5~50~1|2~43.72~1000~1|3~52.0~1~1|4~57.5~7500~1|5~68.0~8~1|6~80.95~6~1|7~84.25~300~1');
with t as (
select string_to_array(x , '|') arr
from tmp
)
select * , cardinality(arr) arr_len , split_part(arr[1],'~',2)
from t
样本输出:
"{1~41.5~50~1,2~43.72~1000~1,3~52.0~1~1,4~57.5~7500~1,5~68.0~8~1,6~80.95~6~1,7~84.25~300~1}";7;"41.5"
我对提取价格感兴趣,该价格表示为每个数组条目的第二项(当用〜分隔时),因此输出将是:
41.5,43.72,52.0,...
当使用时split_part
,该方法仅返回特定数组索引的一个结果,并且我不希望对所有索引进行硬编码,因为它会有所不同。
建议表示赞赏。
这是一种方法:
select t.*, w.prices
from tmp t
cross join lateral (
select array_agg(split_part(v.z, '~', 2)) prices
from regexp_split_to_table(t.x, '\|') as v(z)
) w
在子查询中,我们使用分隔符将字符串拆分为行|
;然后,我们将每一行的第二个元素聚合回一个数组。
您可以明确表示要保留元素的顺序with ordinality
:
select t.*, w.prices
from tmp t
cross join lateral (
select array_agg(split_part(v.z, '~', 2) order by v.n) prices
from regexp_split_to_table(t.x, '\|') with ordinality as v(z, n)
) w
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句