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


118

以下の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


1
sql-fiddleクエリを追加すると便利ですが、SOでは常にプレーンテキストとしてクエリを表示する必要があります。さもなければ、この質問はリンク腐敗に対して脆弱です。
Tim Schmelter 2013年

_ ::単一の文字の代わり
vhadalgi 2013年

回答:


193

次の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つ以上の文字、つまり任意の文字をその値として持つすべての行が得られます。これが_、列の値がない場合でもすべての行を取得する理由です。


アクセスDBでも同じ問題に直面しています。この問題の解決方法を教えてください。

おそらく、「アクセスDBのワイルドカード」のためにグーグルできます。私はAccessに取り組んだことがないので、あなたを助けることはできません。Accessがlikeオペレーターをサポートしているかどうかさえ疑問です。私のソリューションは、すべてではないにしても、ほとんどのデータベースで機能します。
Rachcha 2013年

2
ここで述べられていないのは、これがSQL Serverでも機能するということです。これにより、OPがSQL Serverの質問にタグ付けしたときに、OPがOracle SQLの回答を受け入れた理由に最初は悩まされました。少なくとも回答は、最初にタグ付けされたDBMSを主に対象とするように作成する必要があります。
underscore_d 2017

87

アンダースコアは、任意の1文字のクエリのワイルドカードLIKEです。

したがってLIKE %_%、「この列に少なくとも1つの任意の文字を含むすべてのレコードを提供してください」という意味です。

sql-serverでワイルドカード文字をエスケープする必要があります[]

SELECT m.* 
FROM Manager m 
WHERE m.managerid    LIKE  '[_]%'
AND   m.managername  LIKE '%[_]%'

参照:LIKE(Transact-SQL)

Demo


回答にMSDNリンクを提供していただきありがとうございます。投稿を読むまで、アンダースコアの特殊文字に関する情報を見つけるのに苦労していました。
Chris Smith

5
ユーザーが指定したように、これは正解であるsql-server彼らの質問にタグを、その提供SQLFiddleもMS SQL Serverの2008に指定されている
Govindライ

8

ワイルドカード文字を具体的に検索したいので、それをエスケープする必要があります

これは、ESCAPE句をLIKE式に追加することによって行われます。ESCAPE句で指定された文字は、次のワイルドカード文字を「無効化」します。

ワイルドカード文字ではなく、任意の文字を使用できます。\多くのプログラミング言語でも使用されているため、ほとんどの人は

したがって、クエリの結果は次のようになります。

select * 
from Manager
where managerid LIKE '\_%' escape '\'
and managername like '%\_%' escape '\';

ただし、他の文字も使用できます。

select * 
from Manager
where managerid LIKE '#_%' escape '#'
and managername like '%#_%' escape '#';

SQLFiddleの例を次に示します。http://sqlfiddle.com/#!6 / 63e88 / 4


5

アンダースコアは何かのワイルドカードです。たとえば、 'A_%'は 'A'で始まるすべての一致を検索し、その後に最低1文字の余分な文字がある


0

次のようにクエリを記述できます。

SELECT * FROM Manager
WHERE managerid LIKE '\_%' escape '\'
AND managername LIKE '%\_%' escape '\';

それはあなたの問題を解決します。


これはどのようにして受け入れられた答えを超えて追加しますか?
ノアブロイレス

0

人々がBigQueryでそれを行う方法を探している場合:

  • アンダースコア「_」は、単一の文字またはバイトに一致します。

  • 2つのバックスラッシュを使用して、「\」、「_」、または「%」をエスケープできます。例えば、 "\%"。未加工の文字列を使用している場合、必要なバックスラッシュは1つだけです。たとえば、r "\%"です。

WHERE mycolumn LIKE '%\\_%'

ソース:https : //cloud.google.com/bigquery/docs/reference/standard-sql/operators

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.