条件付きで以下の SQL クエリを作成しましたLIKE
:
SELECT * FROM Manager
WHERE managerid LIKE '_%'
AND managername LIKE '%_%'
LIKE
アンダースコアを検索したい%_%
ただし、列のデータにはアンダースコア文字が含まれていないことはわかっています。
- クエリによってテーブルのすべてのレコードが返されるのはなぜですか?
サンプルデータ:
create table Manager(
id int
,managerid varchar(3)
,managername varchar(50)
);
insert into Manager(id,managerid,managername)values(1,'A1','Mangesh');
insert into Manager(id,managerid,managername)values(2,'A2','Sagar');
insert into Manager(id,managerid,managername)values(3,'C3','Ahmad');
insert into Manager(id,managerid,managername)values(4,'A4','Mango');
insert into Manager(id,managerid,managername)values(5,'B5','Sandesh');
ベストアンサー1
条件を次のように変更しますWHERE
。
WHERE mycolumn LIKE '%\_%' ESCAPE '\'
これはOracleがエスケープ文字をサポートする方法の1つです。ここではキーワードを使用してエスケープ文字を定義しますescape
。詳細については、Oracle Docsのこのリンク。
および'_'
は、 SQL の演算ステートメント'%'
内のワイルドカードですLIKE
。
文字は、_
(任意の) 1 つの文字の存在を検索します。 で検索すると、、、がcolumnName LIKE '_abc'
含まれる行の結果が表示されます'aabc'
が'xabc'
、、、などは含まれません。'1abc'
'#abc'
'abc'
'abcc'
'xabcd'
文字'%'
は、0 個以上の文字に一致するために使用されます。つまり、 で検索すると、 、などが含まれ、 、およびで終わらないその他の文字列はcolumnName LIKE '%abc'
含まれない結果が返されます。'abc'
'aabc'
'xyzabc'
'xyzabcd'
'xabcdd'
'abc'
あなたの場合は、 で検索しました'%_%'
。これにより、その列に 1 つ以上の文字 (つまり、任意の文字) が値として含まれるすべての行が返されます。列の値に が含まれていない場合でも、すべての行が取得されるのはそのためです_
。