拡張機能intarrayの関数を使用することを考えましたが、次のようになりました。
これらの操作の多くは、1次元配列に対してのみ意味があります。より多くの次元の入力配列を受け入れますが、データはストレージ順の線形配列であるかのように扱われます。
私の他のアイデア:
速くて汚い
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[];
これにより、最初の次元の配列添え字が生成されます。このセットを返す関数を使用して、各配列スライスをチェックします。式の右側にある二重括弧に注意して、一致する2次元配列を作成してください。
{4,5}
複数回存在する可能性がある場合は、行の重複を避けるためにまたは句をarr
追加します。GROUP BY
DISTINCT