我想过使用扩展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 BY
或DISTINCT
子句以避免重复行。