1 = ALL(arr) IS NULL AND 2 = ALL(arr) IS NULL
1
および2
任意にすることができます 2つの異なる番号。
代替案とパフォーマンス
多くの方法があります。簡単なテストケースを組み立てました:
SELECT arr::text
, -1 = ALL(arr) IS NULL AS xsimple
, 1 = ALL(arr) IS NULL AND 2 = ALL(arr) IS NULL AS simple
, array_remove(arr, NULL) = '{}' AS array_rem
, cardinality(array_positions(arr, NULL))
= cardinality(arr) AS array_pos
, TRUE = ALL (SELECT unnest(arr) IS NULL) AS michael
, (SELECT bool_and(e IS NULL) FROM unnest(arr) e) AS bool_and
, NOT EXISTS (SELECT unnest(arr) EXCEPT SELECT null) AS exist
FROM (
VALUES
('{1,2,NULL,3}'::int[])
, ('{1,1,1}')
, ('{2,2,2}')
, ('{NULL,NULL,NULL}')
, ('{}'::int[])
) t(arr);
arr | xsimple | simple | array_rem | array_pos | michael | bool_and | exist
------------------+---------+--------+-----------+-----------+---------+----------+-------
{1,2,NULL,3} | f | f | f | f | f | f | f
{1,1,1} | f | f | f | f | f | f | f
{2,2,2} | f | f | f | f | f | f | f
{NULL,NULL,NULL} | t | t | t | t | t | t | t
{} | f | f | t | t | t | | t
array_remove()
Postgres9.3以降が必要です。array_positions()
Postgres9.5以降が必要です。
chk_michael
@michaelが現在受け入れている回答
からのものです 。
列は式のパフォーマンス順になっています。
array_remove()
を使用して、私の単純なチェックがパフォーマンスを支配します。 次。残りはついていけません。
特殊なケースの空の配列({}
) 注意が必要です。期待される結果を定義し、適切な式を選択するか、チェックを追加します。
db <> fiddle こちら
-パフォーマンステストを使用
古い
どのように機能しますか?
式1 = ALL(arr)
収量:
TRUE
..すべての要素が1
の場合
FALSE
..要素が<> 1
の場合 (IS NOT NULL
である要素 )
NULL
..少なくとも1つの要素がIS NULL
の場合 <> 1
の要素はありません
したがって、できない単一の要素がわかっている場合 表示されます(CHECK
によって強制されます 制約)、-1
のように 、次のように簡略化できます:
-1 = ALL(arr) IS NULL
ある場合 番号が表示される可能性があります。2つの異なる番号を確認してください。結果はNULL
のみになります 配列にNULL
しか含まれていない場合は両方 。 Voilá。