0

postgresツールで2次元配列を交差させることは可能ですか?

たとえば、私は持っています:

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の関数を使用することを考えましたが、次のようになりました。

これらの操作の多くは、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 BYDISTINCT

于 2012-08-09T12:20:59.627 に答える