ホームページ  >  記事  >  データベース  >  SQLファジークエリの例の説明

SQLファジークエリの例の説明

零下一度
零下一度オリジナル
2017-07-26 14:52:501819ブラウズ

はじめに

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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。