2

クエリ1:

SELECT ARRAY(select id from contacts where id = 0)::INT[],
       ARRAY[]::INT[],
       ARRAY(SELECT id FROM contacts WHERE id = 0)::INT[] = ARRAY[]::int[]

この結果を生成します:

int4    array   ?column?                                                                    
{}      {}      TRUE

クエリ2:

SELECT (ARRAY(SELECT id FROM contacts WHERE id = 0)::INT[]
      & ARRAY(select id from contacts where id = 0)::INT[]),
        ARRAY[]::INT[],
       (ARRAY(SELECT id FROM contacts WHERE id = 0)::INT[]
      & ARRAY(SELECT id FROM contacts WHERE id = 0)::INT[]) = ARRAY[]::int[]

異なる結果を生成します:

?column?    array   ?column?                                                            
{}              {}      FALSE

なぜ違いがあるのですか?

2番目のクエリのように、空の整数配列を2つの配列の共通部分の結果と比較する他の方法はありますか?

4

1 に答える 1

2

標準のPostgreSQLは、ARRAY交差演算子をサポートしていません。追加のモジュールintarrayをインストールしておく必要があります。

あなたの質問はこれに要約されます:
2つの空の整数配列の交差は空の整数配列を生成します。このクエリで生成されるのはなぜfalseですか?

SELECT ('{}'::int[] & '{}'::int[]) = '{}'::int[]

または他の構文では、同じ意味です:

SELECT (ARRAY[]::int[] & ARRAY[]::int[]) = ARRAY[]::int[]

これがもたらす間true

SELECT '{}'::int[] = '{}'::int[]

はい、それは非常に良い質問です。


その価値について、私は違いを説明することができます:

SELECT array_dims('{}'::int[])
<NULL>

SELECT array_dims('{}'::int[] & '{}'::int[])
[1:0]

つまり、最初の配列は単なる空の配列であり、2番目の配列は空の要素を持つ1次元配列です。

これは非常に混乱する可能性があります。たとえば、string_to_array()を空の出力で処理する方法については、このスレッドを参照してください。オペレーターがここで正しいことをして
いるのかわかりません。&

于 2011-11-03T15:50:08.087 に答える