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

テキスト配列に入力と同様の値が含まれている行を検索する

    ANYを理解することも重要です ない オペレーター ただし、正しいにのみ使用できるSQL構造 オペレーターの。詳細:

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

    LIKE 演算子-またはより正確には: 、それは~~に書き直されます オペレーター Postgresの内部で-を期待します 左側とパターン 右の方へ。 COMMUTATORはありません この演算子の場合(単純な等式演算子=の場合と同様) )したがって、Postgresはオペランドを反転できません。

    あなたの試み:

    select * from someTable where '%someInput%' LIKE ANY(someColum);
    

    左右のオペランドが反転しているため、'%someInput%' です および配列列の要素someColum パターンと見なされます(これはあなたが望むものではありません)。

    ANY(someColum) LIKE '%someInput%'である必要があります -ANYでは不可能な場合を除きます にのみ許可される構成 オペレーターの。ここで障害が発生しています。

    関連:

    • 正規表現パターンを含むテキスト列に便利なインデックスを付ける方法はありますか?
    • PostgreSQLは配列列にインデックスを付けることができますか?

    リレーショナルデザインを正規化し、要素を保存できます。 別のテーブルの別の行の配列の。それを除けば、 unnest() あなたがすでに自分自身を見つけたように、解決策です。ただし、少なくとも1つの一致する要素の存在にのみ関心がありますが、 EXISTS サブクエリは、結果の重複を避けながら最も効率的です-Postgresは、最初の一致が見つかるとすぐに検索を停止できます:

    SELECT *
    FROM   tbl
    WHERE  EXISTS (
        SELECT -- can be empty 
        FROM   unnest(someColum) elem
        WHERE  elem LIKE '%someInput%'
      );
    

    someInputの特殊文字をエスケープすることをお勧めします 。参照:

    • 正規表現またはLIKEパターンのエスケープ関数

    否定に注意してください(NOT LIKE ALL (...)NULLの場合 関与することができます:

    • Postgres配列にNULLが存在するかどうかを確認します


    1. 文字列列を持つSQLBetween句

    2. Oracleデータベースのリカバリ

    3. PHPが複数のチェックボックスとテキストボックスの配列をMySQLデータベースに挿入

    4. ロックされた行を待たないようにするためのアドバイザリロックまたはNOWAIT?