sql >> データベース >  >> RDS >> PostgreSQL

PostgreSQLの配列はすべてNULLですか

    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 こちら -パフォーマンステストを使用
    古い sqlfiddle

    どのように機能しますか?

    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á。



    1. MYSQLは、開始日と終了日の間の文字列として月のクエリリターンリストを選択します

    2. クエリから多次元配列を作成する

    3. デフォルトのCURDATE()を使用したMySQLDATEフィールド。日時ではない

    4. ドロップダウン選択フィールドは、あらゆる種類のインジェクションに対して脆弱ですか?