2016-08-19 10 views
0

私はpostgresで大文字と小文字を区別する検索の問題に遭遇し、すべてのWHEREテストの両側でLOWERを使用して対処し始めました。Postgresの大文字と小文字の区別:Lower()の意味

これまでのところとても良いです。しかし、私はインデックスを利用するためには、LOWERも使用して作成する必要があることを理解しています。

ただし、PKの内容は何ですか?おそらくこれらは有効ではないでしょう。なぜなら、選択されたPKフィールドに関数を使用してPKを作成することはできないように思われるからです。これは、PKで行われているフィルタリングや結合の問題ではありませんか?

これを回避する方法はありますか?

+0

実際にPKとして文字列が必要ですか? workaraoundはサロゲートPKとしてのシリアルです(文字列の一意の制約かもしれません) – joop

+0

現在のモデルがいくつかの製品で使用されているレガシーデータベースです。大幅な変更を行うと、最小限に抑えることを望む回帰テストの量が不均衡になります。ありがとう。 – Hughgo

答えて

1

あなたはまだPK(でも多くの列からなる)上の機能のインデックスを作成することができます:あなたはこのようなものを経験している場合に行われるいくつかのデータの改善作業の必要性があるように聞こえる、

CREATE TABLE test(a text, b text, c text, d text, primary key (a,b,c)); 
CREATE INDEX ON test (lower(a), lower(b), lower(c)); 

もののをデータベース内のほぼすべての場所で動作します(小文字のすべてを格納します)。

+0

私は、独自の権利でインデックスを作成するPKの作成を期待します。これは、基本データとLOWERcaseデータにインデックスがあることを意味します。クエリプランで使用するクエリをどのように把握したらよいでしょうか? – Hughgo

+0

WHERE句に応じて、オプティマイザは適切なプランを選択します。 SQL文の前に置かれた 'EXPLAIN'キーワードで自分自身を試してみてください。 –

+0

ありがとうございます。私はそれを見るでしょう。 – Hughgo

2

ここにいくつかの考えがあります。

最初に、は、格納されたデータを小文字にする必要がある任意の列に制約を追加できます。それはデータベース内の問題を解決します。

第2に、トリガーを使用して任意の値を小文字に変換できます。

第3に、ilikeを使用できます。大文字と小文字を区別しない検索にインデックスを使用できます。

第4に、すべての主キーが合成数値の主キーである場合、大文字と小文字の区別について心配する必要はありません。

関連する問題