2

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

4

1 回答 1

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 扩展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 方附加组件。该解决方案无需进一步操作即可产生NULL结果。44

于 2012-10-15T01:03:22.043 回答