はじめに
SQL のあいまいクエリに関して言えば、最初に思い浮かぶのは like キーワードでしょう。
特定のフィールドを含むデータをクエリする必要がある場合、多くの場合、「%keyword%」クエリ メソッドを使用します。例:
SELECT ... FROM 表名 WHERE 字段名 LIKE '%关键字%'
これは典型的な「XXX を含む」メソッドとみなされますが、フィールドに特定の文字を含むデータをクエリする必要がある場合はどうすればよいでしょうか?
たとえば、連絡先データ テーブル ConnectName があり、名前を記録するフィールドがあります。 Xiaolan と Haiyuan という名前の人の連絡先を知りたいです。通常の状況では、まず次のことが考えられます:
SELECT * FROM ConnectName WHERE name = '小兰' OR name = '灰原'
このアプローチはこの目的を達成できます。このとき、突然「コナン」などの別の人物をチェックしたい場合は、SQL 構造を変更して Where 条件文を追加する必要があります:
SELECT * FROM ConnectName WHERE name = '小兰' OR name = '灰原' OR name = '柯南'
OR 条件クエリ自体が効率的であることがわかっています。下位の構造的に変化するステートメントは、MyBatis で実装するのが少し面倒です (もちろん、フィールドを走査して挿入するだけで実装できます)。
もっとシンプルにできないでしょうか?すべてのキーワードをまとめて、Where 条件を 1 つだけ使用してそれを達成できますか?
CHARINDEX が登場します
この時点で、CHARINDEX キーワードを使用して、テキスト文字列内の特定のフィールドが出現する位置を返すことができます。さらにお楽しみに、栗を取り出します:
CHARINDEX('李白','曹操很帅') =0
上の栗では、曹操は非常にハンサムであるため、李白キーワードが含まれていないため、見つからず、0 が返されます
CHARINDEX('李白','李白很帅') =1
同じ栗には Li Bai キーワードが含まれているため、キーワードの先頭の最初の単語のインデックスが返されるため、1 が返されます。
使い方を理解した後、CHARINDEX キーワードを使用して最適化できます。 SQL ステートメント:
SELECT * FROM ConnectName WHERE CHARINDEX(name ,'小兰灰原柯南')>0
名前フィールドに対応する名前が「Conan Xiaolan Haibara」に表示される場合、CHARINDEX 関数は 1 より大きい値を返し、必要なデータを取得できます (これら 3 つを使用することもできます)一緒に楽しく遊んでください^-^)
対応するmybatisの実装も比較的簡単です
SELECT * FROM ConnectName WHERE <!--[CDATA[ AND CHARINDEX(name ,#{传入的参数}) --> 0 ]]>
毛利小五郎など、後で新しい人物を追加したい場合は、「小蘭灰原コナン毛利小五郎」を追加するだけです。受信パラメータのほうがはるかに簡単ではないでしょうか。
以上がSQLファジークエリの例の説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。