给定一个表示路径 ( '/11/22/33/44'
) 的字符串列,如何返回给定数字之后的下一个数字。
例如:
- 给定一个 id=
22
,我要回33
从路径/11/22/33/44/
. - 给定一个 id=
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
)?
最佳答案
一种方法是窗口函数:
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 一起发布的扩展,它不是第 3 方附加组件。此解决方案会为 44
生成 NULL
结果,无需进一步操作。
关于sql - 从数组中获取下一个项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12888047/