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

複数の列間のマッチングパターン

    これまでのところ、答えはあなたの質問に答えることができません:

    LIKEを使用しても、ほとんど違いはありません。 または= 文字列全体に一致する限り( にワイルドカード文字がない場合) あなたの文字列)。検索をあいまいにするには、置換する必要があります パターンに追加するだけでなく、パターンの一部です。

    たとえば、subcolumnの最後の7文字(8文字ではなく)を照合します :

    SELECT *
    FROM   maintable m
    WHERE  left(maincolumn, 8) LIKE 
           ( '%' || left((SELECT subcolumn FROM subtable WHERE subid = 2), 7));
    

    より単純なleft()を使用します (Postgres 9.1で導入されました。)
    あなたはcould これを単純化して:

    SELECT *
    FROM   maintable m
    WHERE  left(maincolumn, 7) =
           (SELECT left(subcolumn,7) FROM subtable WHERE subid = 2);
    

    ただし、機能インデックスの式を使用するには正確に一致させる必要があるため、後で説明する特別なインデックスを使用する場合は使用しません。

    拡張機能 pg_tgrmに興味があるかもしれません。 。

    PostgreSQL 9.1では、データベースごとに1回実行します。

    CREATE EXTENSION pg_tgrm;
    

    2つの理由:

    • 類似性演算子% 。これを使用すると、スマートな類似検索を構築できます:

      --SELECT show_limit();
      SELECT set_limit(0.5); -- adjust similarity limit for % operator
      
      SELECT *
      FROM maintable m
      WHERE left(maincolumn, 8) %
            (SELECT subcolumn FROM subtable WHERE subid = 2);
      
    • インデックスサポートを提供します 両方のLIKE および%

      書き込みパフォーマンスよりも読み取りパフォーマンスの方が重要な場合は、を作成することをお勧めします。機能的 このようなGINまたはGiSTインデックス:

      CREATE INDEX maintable_maincol_tgrm_idx ON maintable
      USING gist (left(maincolumn, 8) gist_trgm_ops);
      

      このインデックスはどちらのクエリもサポートします。書き込み操作にはいくらかのコストがかかることに注意してください。
      同様のケースの簡単なベンチマークこの関連する回答で 。



    1. resultset.getObjectのAbstractMethodError

    2. コードイグナイター動的ルーティング

    3. SubSonicはMySql外部キーテーブルを生成していません

    4. Oracle.DataAccessの不一致エラー