1. ホーム
  2. sql

[解決済み] LIKEフィルターでアンダースコア文字を使用すると、なぜすべての結果が表示されるのですか?

2022-04-27 06:44:50

質問

以下のような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-Fiddle

解決方法は?

を修正します。 WHERE の条件は、このようになります。

WHERE mycolumn LIKE '%\_%' ESCAPE '\'

これは、Oracleがエスケープ文字をサポートする方法の一つです。ここで、エスケープ文字を定義するには escape キーワードを使用します。詳しくは このリンクはOracle Docsにあります。 .

'_''%' はワイルドカードで LIKE をSQLで操作したものです。

_ 文字は、(任意の)一文字の存在を探します。もし columnName LIKE '_abc' を持つ行の結果が返されます。 'aabc' , 'xabc' , '1abc' , '#abc' ただし 'abc' , 'abcc' , 'xabcd' といった具合です。

は、その '%' 文字は、0文字以上のマッチングに使用されます。つまり columnName LIKE '%abc' を持つ結果が得られます。 'abc' , 'aabc' , 'xyzabc' などがありますが 'xyzabcd' , 'xabcdd' で終わらないその他の文字列は 'abc' .

で検索した場合 '%_%' . これは、その列の値が1つ以上の文字、つまり任意の文字を持つすべての行を返します。このため、行の中に _ をカラムの値として使用します。