フィールド内のスペースが無視されるようにクエリを実行する最良の方法は何ですか?たとえば、次のクエリ:
SELECT * FROM mytable WHERE username = "JohnBobJones"
SELECT * FROM mytable WHERE username = "John Bob Jones"
次のエントリが見つかります。
John Bob Jones
JohnBob Jones
JohnBobJones
私はphpまたはpythonを使用していますが、これは問題ではないと思います。
SELECT * FROM mytable
WHERE REPLACE(username, ' ', '') = REPLACE("John Bob Jones", ' ', '')
場合によります。良いパフォーマンスを気にしない場合、できることはたくさんありますが、それらのほとんどは遅くなります。多分それはあなたのために大丈夫ですが、他の読書が速い解決策を望んでいる場合のために、私はこの答えをここに残します。
非常に高速なパフォーマンスが必要な場合は、データベース内にスペースなしで文字列のインデックスを作成する必要があります。 PostgreSQLでは、 関数のインデックスを作成 ができます。これを使用して、空の文字列で置き換えられたスペースで列にインデックスを作成できます。この方法の利点は、インデックスの作成以外にメンテナンスが必要ないことです。
MySQLではこれを行うことができないため、最も簡単な方法は、データベース内のデータを複製することです。スペースを1回使用し、1回使用しない場合です。 WHERE句ではスペースなしの列を使用しますが、SELECT列リストでは元の列を使用します。列の同期を維持する必要があるため、これにはさらにメンテナンスが必要です。これは、アプリケーションロジックまたはデータベーストリガーを使用して実行できます。
提案されたソリューションは非常によく見えますが、クエリを次のようなもので制限することが可能な場合、パフォーマンスには恐ろしいです
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 をご覧ください
これを試して:
SELECT * FROM mytable WHERE username =REPLACE("John Bob Jones", ' ', '')
スペース、空白、文字の数に関係なく、テキストを検索することがよくあります。
トリム、小文字、およびすべてのマルチワード非ワード文字を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:これは多くの空白と異なる文字を区別する長いテキストです
データのガベージとクエリのジャンクですが、それでも正しいことがわかります。