LIKE フィルターでアンダースコア文字を使用すると、すべての結果が表示されるのはなぜですか? 質問する

LIKE フィルターでアンダースコア文字を使用すると、すべての結果が表示されるのはなぜですか? 質問する

条件付きで以下の 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');

SQL フィドルのデモ

ベストアンサー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 つ以上の文字 (つまり、任意の文字) が値として含まれるすべての行が返されます。列の値に が含まれていない場合でも、すべての行が取得されるのはそのためです_

おすすめ記事