给定一个表示路径('/11/22/33/44'
)的字符串列,如何在给定路径后返回下一个数字。
例如:
22
,我想从路径33
返回/11/22/33/44/
。44
,我想从路径NULL
返回/11/22/33/44/
。这是我用来将字符串转换为一组记录的位:
SELECT unnest(string_to_array(trim(both '/' from '/11/22/33/44/'), '/')::integer[]);
unnest
--------
11
22
33
44
(4 rows)
但是如何在这里获取“下一个条目”(所以给定22
- > 33
)?
答案 0 :(得分:2)
一种方法是窗口功能:
SELECT a FROM (
SELECT *, lag(a) OVER () AS lag_1
FROM unnest(string_to_array(trim(both '/' from '/11/22/33/44/'), '/')::integer[]) a
) b WHERE lag_1 = 22;
此解决方案为44
输入返回零行,但可以通过将其作为子查询调用来轻松解决。
或者,对于整数数组,您可以使用intarray extension的idx
函数:
CREATE EXTENSION intarray;
WITH x(arr) AS (
SELECT string_to_array(trim(both '/' from '/11/22/33/44/'), '/') :: integer[]
)
SELECT arr[idx(arr,22)+1] FROM x;
查找数组中的下一个索引。 intarray
是与PostgreSQL一起发布的扩展,它不是第三方附加组件。此解决方案为NULL
生成44
结果,无需进一步操作。