sql - 从数组中获取下一个项目

标签 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 )?

最佳答案

一种方法是窗口函数:

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 一起发布的扩展,它不是第 3 方附加组件。此解决方案会为 44 生成 NULL 结果,无需进一步操作。

关于sql - 从数组中获取下一个项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12888047/

相关文章:

php - MySQL 表到 xml 文件 : update files when tables are updated

php - 以可读/分层格式显示数组

php - 为 SQL 查询构造数组时出现问题

javascript - 以html形式从js数组动态填充div

sql - 如何在 PostgreSQL8 上使用临时序列和 SELECT 创建 sql 函数

postgresql - 文本字段相等

sql - 为并发事务中执行的 INSERT 获取不同的行集

sql - 仅更新 mysql DateTime 字段中的时间

mysql - 如何从 MySQL JSON 数组中选择行?

arrays - Swift - 根据相同的特征对元素进行分组