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

PostgreSQLのINとANY演算子

    (どちらのIN ANY 「オペレーター」です。 「構成」または「構文要素」。)

    論理的に 、マニュアルの引用:

    IN = ANYと同等です 。

    ただし、構文のバリエーションは2つあります。 INの およびANYの2つのバリアント 。詳細:

    • RailsのWHERE句でINの代わりにANYを使用するにはどうすればよいですか?

    IN セットを取得する = ANYと同等です セットを取る 、ここに示されているように:

    • postgreSQL-in vs any

    しかし、それぞれの2番目のバリアントは他と同等ではありません。 ANYの2番目のバリアント コンストラクトは配列を取ります (実際の配列型である必要があります)一方、INの2番目のバリアント カンマで区切られた値のリストを取ります 。これにより、値の受け渡しにさまざまな制限が生じ、できます また、特別な場合には異なるクエリプランにつながります:

    • インデックスは=any()では使用されません ただし、inで使用されます
    • 複数の値のセットまたは配列を関数に渡します
    • 複合型の配列内の要素を一致させる方法は?

    ANY より用途が広い

    ANY コンストラクトは、=だけでなく、さまざまな演算子と組み合わせることができるため、はるかに用途が広いです。 。例:

    SELECT 'foo' LIKE ANY('{FOO,bar,%oo%}');
    

    多数の値の場合、セットを提供します それぞれのスケーリングが向上します:

    • 大きなINを使用してPostgresクエリを最適化する

    関連:

    • PostgreSQLは配列列にインデックスを付けることができますか?

    反転/反対/除外

    "idがある行を検索する 指定された配列にあります」:

    SELECT * FROM tbl WHERE id = ANY (ARRAY[1, 2]);
    

    反転: "idの行を検索 ない 配列内」:

    SELECT * FROM tbl WHERE id <> ALL (ARRAY[1, 2]);
    SELECT * FROM tbl WHERE id <> ALL ('{1, 2}');  -- equivalent array literal
    SELECT * FROM tbl WHERE NOT (id = ANY ('{1, 2}'));
    

    3つすべてに相当します。最初は配列コンストラクターを使用し、他の2つは配列リテラルを使用します。データ型は、コンテキストから明確に導き出すことができます。それ以外の場合は、'{1,2}'::int[]のように明示的なキャストが必要になる場合があります 。

    id IS NULLの行 これらの式のいずれも渡さないでください。 NULLを含めるには 追加の値:

    SELECT * FROM tbl WHERE (id = ANY ('{1, 2}')) IS NOT TRUE;
    


    1. CTEを使用して列の値を文字列に連結することは可能ですか?

    2. MariaDBでのEXPORT_SET()のしくみ

    3. 致命的なエラー:キャッチされないエラー:未定義の関数mysql_connect()の呼び出し

    4. GROUPBYおよび集計連続数値