PostgreSQL 计算拆分后的前缀组合



我确实有一个字符串作为条目,形式为foo:bar:something:221.我正在寻找一种方法来生成一个包含此字符串的所有前缀的表,例如:

  • foo
  • foo:bar
  • foo:bar:something
  • foo:bar:something:221

我写了以下查询来拆分字符串,但无法弄清楚从那里开始

select unnest(string_to_array('foo:bar:something:221', ':'));

一个选项是模拟所有元素的循环,然后从每个元素索引的输入中获取子数组:

with data(input) as (
values (string_to_array('foo:bar:something:221', ':'))
)
select array_to_string(input[1:g.idx], ':')
from data
cross join generate_series(1, cardinality(input)) as g(idx);

generate_series(1, cardinality(input))生成的行数与数组包含的元素数一样多。表达式input[1:g.idx]采用从第一个到"idx"的"子数组"。由于输出是一个数组,我使用array_to_string重新创建带有:的表示

您可以将string_agg用作窗口函数。 默认帧是从分区的开头到当前行:

SELECT string_agg(s, ':') OVER (ORDER BY n) 
FROM unnest(string_to_array('foo:bar:something:221', ':')) WITH ORDINALITY AS u(s, n);
string_agg
-----------------------
foo
foo:bar
foo:bar:something
foo:bar:something:221
(4 rows)

最新更新