从数组中获取下一个项目

时间:2012-10-15 00:59:24

标签: sql arrays postgresql

给定一个表示路径('/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)?

1 个答案:

答案 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 extensionidx函数:

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结果,无需进一步操作。