2016-10-18 5 views
0

私たちは顧客が "Bob"と "Bob"を別の時間入力したデータベースを持っています。SQLでアポストロフィと一重引用符を等しく扱う文字列を検索する方法

誰かが "Bob"または "Bob"を検索すると、アポストロフィに使用したものに関係なくすべてのケースを検索したいと思います。

私が思いつくことができるのは、人々の質問を見て、いずれかの出現を(’|'')(エスケープされた一重引用符に注意してください)と同様のものを使用して置き換えることです。

SELECT * from users WHERE last_name SIMILAR TO 'O(’|'')Dell' 

もっと良い方法がありますか、理想的にはこれらを交換可能にする設定ですか?

答えて

0

上記の両方のケースが有効で同じ情報を示している場合は、後で取得するためにデータベースに到着する前に実際にデータを処理することを検討する可能性があります。つまり、アプリケーションコード内の1つの符号を別の符号に置き換えるか、またはbefore insertトリガーを効果的に置き換えることができます。

上記のようなケースがさらに増えた場合は、残念ながらLIKEクエリを指定するだけです。

また、データベースからレコードを取得し、そのような問題を回避するものがあれば、最も近いものを返す別のユーザーを作成しながら、お客様のヒントを検討することもできます。

PostgresのDQLでこれらのシンボルのうちの2つを同じにするような設定はありません。少なくとも私は1つに慣れていない。

+0

私は複数の言語が関係しているため、入力されたデータを操作することが嫌いです。ユーザーが実際に複数の言語を必要とする場合があります。私は "一重引用符のようなアポストロフィを扱う"ことを望んでいましたが、それは存在しません。 –

+0

類似しているかどうかにかかわらず、あなたはまだそれらの両方を書く必要があります。関数内でこれを囲み、関数インデックスを作成することもできます:-) –

1

あなたは個人的に私は(私は私のプロジェクトの一つで同じ問題を抱えていた)1つのクエリでテーブル内のすべてのアポストロフィを置き換えますregexp matching

with a_table(str) as (
values 
    ('Bob''s'), 
    ('Bob’s'), 
    ('Bobs') 
) 
select * 
from a_table 
where str ~ 'Bob[''’]s'; 

    str 
------- 
Bob's 
Bob’s 
(2 rows) 

を使用することができます。

+0

ありがとうございます。これと同様の利点はありますか? –

+1

[PostgreSQLのLIKE、SIMILAR TOまたは正規表現とのパターンマッチング](http://dba.stackexchange.com/questions/10694/pattern-matching-with-like-similar-to-or-regular-expressions-in -postgresql/10696#10696) – klin

関連する問題