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

HerokuのRails3.1でのPostgresアクセントに依存しないLIKE検索

    貧乏人の解決策

    関数を作成できる場合は、これを使用できます。 ここ からリストを編集しました。 時間をかけて追加しました。かなり完成です。一部の文字を削除することもできます:

    CREATE OR REPLACE FUNCTION lower_unaccent(text)
      RETURNS text AS
    $func$
    SELECT lower(translate($1
         , '¹²³áàâãäåāăąÀÁÂÃÄÅĀĂĄÆćčç©ĆČÇĐÐèéêёëēĕėęěÈÊËЁĒĔĖĘĚ€ğĞıìíîïìĩīĭÌÍÎÏЇÌĨĪĬłŁńňñŃŇÑòóôõöōŏőøÒÓÔÕÖŌŎŐØŒř®ŘšşșߊŞȘùúûüũūŭůÙÚÛÜŨŪŬŮýÿÝŸžżźŽŻŹ'
         , '123aaaaaaaaaaaaaaaaaaacccccccddeeeeeeeeeeeeeeeeeeeeggiiiiiiiiiiiiiiiiiillnnnnnnooooooooooooooooooorrrsssssssuuuuuuuuuuuuuuuuyyyyzzzzzz'
         ));
    $func$ LANGUAGE sql IMMUTABLE;
    

    クエリは次のように機能するはずです:

    find(:all, :conditions => ["lower_unaccent(name) LIKE ?", "%#{search.downcase}%"])
    

    左アンカー検索の場合、関数のインデックスを非常に利用できます。 速い結果:

    CREATE INDEX tbl_name_lower_unaccent_idx
      ON fest (lower_unaccent(name) text_pattern_ops);
    

    次のようなクエリの場合:

    SELECT * FROM tbl WHERE (lower_unaccent(name)) ~~ 'bob%'
    

    適切なソリューション

    PostgreSQL9.1以降の場合 、必要な権限があれば、次のことができます。

    CREATE EXTENSION unaccent;
    

    関数unaccent()を提供します 、必要なことを実行します(lower()を除く) 、必要に応じて追加で使用してください)。 この拡張機能に関するマニュアル をお読みください 。
    PostgreSQL 9.0でも利用可能 ただし、CREATE EXTENSION 構文は9.1の新機能です。

    アクセントなしとインデックスの詳細:



    1. MySQLテーブル列で重複しないレコードを選択します

    2. scope_identity()を使用してネストされた一括挿入を実行する最速の方法は?

    3. 手順なしで日付の範囲を使用してテーブルを結合する方法

    4. mysqlで2つの日時を減算します(1つは24時間形式、もう1つはam / pm形式)