[sql] LIKE 필터에서 밑줄 문자를 사용하면 모든 결과가 표시되는 이유는 무엇입니까?

LIKE조건 과 함께 아래 SQL 쿼리를 작성했습니다 .

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의이 링크 를 참조하십시오 .

'_''%'A의 와일드 카드입니다 LIKESQL에서 운영하는 문.

_문자 (모든) 하나 개의 캐릭터의 존재를 찾습니다. 당신이로 검색하는 경우 columnName LIKE '_abc', 그것은 당신이 행을 갖는 결과를 줄 것이다 'aabc', 'xabc', '1abc', '#abc'하지만 'abc', 'abcc', 'xabcd'등등.

'%'문자는 0 개 이상의 문자를 일치시키는 데 사용됩니다. 당신이로 검색하면 그 말은 columnName LIKE '%abc', 그것이 갖는 당신이 결과를 줄 것이다 'abc', 'aabc', 'xyzabc'등,하지만 'xyzabcd', 'xabcdd'로 끝하지 않는 다른 문자열 'abc'.

귀하의 경우에는 '%_%'. 이렇게하면 해당 열에 하나 이상의 문자가있는 모든 행, 즉 모든 문자가 값으로 제공됩니다. 이것이 _열 값에 없는 경우에도 모든 행을 가져 오는 이유 입니다.


답변

밑줄은 임의의 문자 하나 에 대한LIKE 쿼리 의 와일드 카드입니다 .

따라서 LIKE %_%“이 열에 하나 이상의 임의 문자가있는 모든 레코드를 제공하십시오”를 의미합니다.

sql-server에서 다음과 같이 와일드 카드 문자를 이스케이프해야합니다 [].

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

참조 : LIKE (Transact-SQL)

Demo


답변

와일드 카드 문자를 구체적으로 검색하려면 이스케이프해야합니다.

표현식에 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


답변

밑줄은 무언가에 대한 와일드 카드입니다. 예를 들어 ‘A_ %’는 Start whit ‘A’와 일치하는 모든 일치 항목을 찾고 그 뒤에 최소 1 개의 추가 문자가 있습니다.


답변

다음과 같이 쿼리를 작성할 수 있습니다.

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

그것은 당신의 문제를 해결할 것입니다.


답변

사람들이 BigQuery에서 방법을 검색하는 경우 :

  • 밑줄 “_”은 단일 문자 또는 바이트와 일치합니다.

  • 두 개의 백 슬래시를 사용하여 “\”, “_”또는 “%”를 이스케이프 할 수 있습니다. 예 : “\ %”. 원시 문자열을 사용하는 경우 단일 백 슬래시 만 필요합니다. 예 : r “\ %”.

WHERE mycolumn LIKE '%\\_%'

출처 : https://cloud.google.com/bigquery/docs/reference/standard-sql/operators


답변