web-dev-qa-db-ja.com

スペースを無視するクエリ

フィールド内のスペースが無視されるようにクエリを実行する最良の方法は何ですか?たとえば、次のクエリ:

SELECT * FROM mytable WHERE username = "JohnBobJones"    
SELECT * FROM mytable WHERE username = "John Bob Jones"

次のエントリが見つかります。

John Bob Jones
JohnBob Jones
JohnBobJones

私はphpまたはpythonを使用していますが、これは問題ではないと思います。

29
xRobot
SELECT * FROM mytable 
    WHERE REPLACE(username, ' ', '') = REPLACE("John Bob Jones", ' ', '')
59
SLaks

場合によります。良いパフォーマンスを気にしない場合、できることはたくさんありますが、それらのほとんどは遅くなります。多分それはあなたのために大丈夫ですが、他の読書が速い解決策を望んでいる場合のために、私はこの答えをここに残します。

非常に高速なパフォーマンスが必要な場合は、データベース内にスペースなしで文字列のインデックスを作成する必要があります。 PostgreSQLでは、 関数のインデックスを作成 ができます。これを使用して、空の文字列で置き換えられたスペースで列にインデックスを作成できます。この方法の利点は、インデックスの作成以外にメンテナンスが必要ないことです。

MySQLではこれを行うことができないため、最も簡単な方法は、データベース内のデータを複製することです。スペースを1回使用し、1回使用しない場合です。 WHERE句ではスペースなしの列を使用しますが、SELECT列リストでは元の列を使用します。列の同期を維持する必要があるため、これにはさらにメンテナンスが必要です。これは、アプリケーションロジックまたはデータベーストリガーを使用して実行できます。

11
Mark Byers

提案されたソリューションは非常によく見えますが、クエリを次のようなもので制限することが可能な場合、パフォーマンスには恐ろしいです

SELECT * FROM mytable WHEREユーザー名 'John%'およびREPLACE(username、 ''、 '')= REPLACE( "John Bob Jones"、 ''、 '')

また、REGEXPを使用できます。

SELECT * FROM mytable WHEREユーザー名REGEXP '^ John * Bob * Jones'

そしてパフォーマンス、一般的に悪い考えである場所での操作を覚えておいてください。

http://dev.mysql.com/doc/refman/5.7/en/pattern-matching.html をご覧ください

2
Mquinteiro

これを試して:

SELECT * FROM mytable WHERE username =REPLACE("John Bob Jones", ' ', '')
1
Mathusuthanan

スペース、空白、文字の数に関係なく、テキストを検索することがよくあります。

トリム、小文字、およびすべてのマルチワード非ワード文字を1つのスペースに置き換えるだけです。

SELECT regexp_replace(trim(lower('Here is              a            long               text               , with            many                 white spaces         AND             different                 character              sensitive')),'\W+',' ','g') t 

return:これは多くの空白と異なる文字を区別する長いテキストです

これが検索の使用法です。言葉の順序だけが重要であり、それ以上は重要ではありません。

select * from (
SELECT regexp_replace(trim(lower('Here is              a            long               text               , with            many                 white spaces         AND             different                 character              sensitive')),'\W+',' ','g') t 
) as o
where t= regexp_replace(trim(lower('Here  is a LonG      TEXT , with            mANY white   ^    spaces         AND           different  character              sensiTive')),'\W+',' ','g')

return:これは多くの空白と異なる文字を区別する長いテキストです

データのガベージとクエリのジャンクですが、それでも正しいことがわかります。

0
Adam111p