特定のアルファベットを含むSQLクエリの結果の一部が欠落しているのはなぜですか?

Dec 15 2020

私は次の表を持っています

次のクエリを実行すると、「s」を含むすべてのインストラクター名が表示されるはずですが、表示されません。私が書いたクエリ:

SQL> SELECT instructor_name
  2  FROM instructor
  3  WHERE instructor_name LIKE '%s%';

結果は次のとおりです。

ここでの問題は何ですか?BalbirSilakarとSauravPangeniも結果に表示されるべきではありませんか?

回答

1 GMB Dec 15 2020 at 21:47

's''S'列に大文字と小文字が区別される照合順序がある場合、これらは2つの異なるものです。

残念ながら、Oracleでは大文字と小文字を区別しないバージョンlike(通常ilikeは他のデータベースで呼び出されます)は提供されていません。

あなたができること:

where instructor_name like '%s%' or instructor_name like '%S%' 

または:

where lower(instructor_name) like '%s%' 

または、regexp_like();を使用できます。大文字と小文字を区別しないようにするために使用できる3番目の引数を取ります。

where regexp_like(instructor_name, 's', 'i')

正規表現が3つの中で最速のオプションになることは驚くことではありません。

catfood Dec 15 2020 at 21:39

データベース(デフォルトでは大文字と小文字が区別される)であるため、LIKEマッチングメカニズムでは大文字と小文字が区別されます。これらの名前には大文字のSが含まれています。

検索で大文字と小文字を区別しないようにする方法に関するQ&Aを次に示します。大文字と小文字を区別するSQLServerデータベースで大文字と小文字を区別しないLikeクエリを実行する

leftjoin Dec 15 2020 at 21:47

大文字と小文字を区別しないチェックには、regexp_likeを使用します

where regexp_like(instructor_name , 's', 'i');
WilliamRobertson Dec 16 2020 at 05:16

他の人が言及したように、s(chr(115))とS(chr(83))は2つの異なるものでありs、「BalbirSilakar」または「SauravPangeni」にはありません。

Oracle 12.2から、次を使用できます。

where instructor_name collate binary_ci like '%s%';

さらに、アクセントを無視することができます

where instructor_name collate binary_ai like '%s%';