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

次のクエリを実行すると、「s」を含むすべてのインストラクター名が表示されるはずですが、表示されません。私が書いたクエリ:
SQL> SELECT instructor_name
2 FROM instructor
3 WHERE instructor_name LIKE '%s%';
結果は次のとおりです。

ここでの問題は何ですか?BalbirSilakarとSauravPangeniも結果に表示されるべきではありませんか?
回答
'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つの中で最速のオプションになることは驚くことではありません。
データベース(デフォルトでは大文字と小文字が区別される)であるため、LIKEマッチングメカニズムでは大文字と小文字が区別されます。これらの名前には大文字のSが含まれています。
検索で大文字と小文字を区別しないようにする方法に関するQ&Aを次に示します。大文字と小文字を区別するSQLServerデータベースで大文字と小文字を区別しないLikeクエリを実行する
大文字と小文字を区別しないチェックには、regexp_likeを使用します
where regexp_like(instructor_name , 's', 'i');
他の人が言及したように、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%';