0

postgres 工具可以与二维数组相交吗?

例如我有:

id               arr
1    {{1,2}, {3,4}, {4,5}, {4,7}}
2    {{4,2}, {7,4}, {8,5}, {9,7}}

...

我想获取{4,5}他们数组中的所有记录,记录id=1在这里。
如果我这样做:

select * from table where arr && '{4,5}'

我会得到这两个示例记录。它会查找数组中任何位置为 4 和 5 的所有记录 - 就好像它正在查看完全提取的数组一样,例如{1,2,3,4,4,5,4,7}.

4

1 回答 1

2

我想过使用扩展intarray中的函数,但是:

其中许多操作仅对一维数组有效。尽管它们将接受更多维度的输入数组,但数据被视为按存储顺序排列的线性数组

我的其他想法:

又快又脏

WITH x(id, arr) AS (VALUES
    (1, '{{1,2}, {3,4}, {4,5}, {4,7}}'::int[])
   ,(2, '{{4,2}, {7,4}, {8,5}, {9,7}}')
   )
SELECT * 
FROM   x
WHERE  arr::text LIKE '%{4,5}%';

简单的技巧是将数组转换为它的文本表示并检查LIKE.

使用数组函数

WITH x(id, arr) AS (
    VALUES
     (1, '{{1,2}, {3,4}, {4,5}, {4,7}}'::int[])
    ,(2, '{{4,2}, {7,4}, {8,5}, {9,7}}')
    )
    ,y AS (
    SELECT id, arr, generate_subscripts(arr, 1) AS i
    FROM   x
)
SELECT id, arr
FROM   y
WHERE  arr[i:i] = '{{4,5}}'::int[];

或者,以您的示例为基础,以不同的符号表示相同:

SELECT id, arr
FROM  (
    SELECT id, arr, generate_subscripts(arr, 1) AS i
    FROM   tbl
    ) x
WHERE  arr[i:i] = '{{4,5}}'::int[];

这会生成第一个维度的数组下标。在这个集合返回函数的帮助下,我们检查每个数组切片。请注意表达式右侧的双括号,以创建匹配的二维数组。

如果{4,5}可以在arr多次,添加GROUP BYDISTINCT子句以避免重复行。

于 2012-08-09T12:20:59.627 回答