programing

NOT LIKE 및 LIKE가 반대 결과를 반환하지 않음

nasanasas 2020. 12. 12. 11:05
반응형

NOT LIKE 및 LIKE가 반대 결과를 반환하지 않음


200 개 레코드 중 10 개 레코드에 'TAX'라는 단어가 포함 된 텍스트가있는 테이블이 있습니다.

내가 실행할 때

Select * from tbl1 WHERE [TextCol] LIKE '%TAX%'

그런 다음 10 개의 레코드로 결과 집합을 올바르게 얻습니다.

그러나 내가 그 기록을 제외하려고 할 때

Select * from tbl1 WHERE [TextCol] NOT LIKE '%TAX%'

190 개 대신 100 개의 레코드 만 반환합니다.


이것이 올바른 결과를 반환합니까?

Select * from tbl1 WHERE COALESCE([TextCol],'-1') NOT LIKE '%TAX%'

NULL여기에서 값이 문제 라고 생각 합니다. 열에 값이 포함되어 있으면 NULL NOT LIKE '%TAX%'반환 UNKNOWN/NULL되므로 선택되지 않습니다.

값을 다루는 방법NULL 이나 여기 를 읽어 보는 것이 좋습니다 .

@ughai가 제안했듯이 성능이 문제인 경우 다음을 사용할 수도 있습니다.

  Select * from tbl1 
  WHERE [TextCol] NOT LIKE '%TAX%'
     OR [TextCol] IS NULL

(A) SQL 비교 연산자는 True, False 및 Unknown의 세 가지 가능한 값을 생성합니다. 피연산자가 하나 또는 둘 다 있으면 NULL결과는 알 수 없음입니다. 일부 값 (사람의 나이)을 상수 (18)와 비교하는 다음 예를 고려하십시오.

21   >= 18 -- True
15   >= 18 -- False
NULL >= 18 -- Unknown

보시다시피 데이터베이스는 NULL18보다 크거나 같은지 결정할 수 있습니다 .

(B) 데이터베이스는 WHERE절이 True로 평가되는 행만 반환합니다 . 식을 반전 (예 :으로 WHERE age >= 18변경 WHERE age < 18)해도 알 수없는 결과에는 영향을주지 않습니다.

을 사용하여 IS [NOT] NULL을 일치 시킬 수 있습니다 NULL. 다음 쿼리는 열이 패턴과 일치하지 않거나 열이 NULL 인 행을 선택합니다.

WHERE [TextCol] NOT LIKE '%TAX%' OR [TextCol] IS NULL

ISNULL같은 함수를 COALESCE사용하여 NULL일부 값 으로 변환 할 수 있습니다 .


나에게도 한번 일어난다! 내 머리를 부수고 난 후 그것이 null 값 때문이라는 것을 알았 으므로이 쿼리를 사용하여 피할 수 있습니다.

WHERE CASE WHEN [TextCol] IS NULL
           THEN 'default' 
           ELSE [TextCol] 
      END NOT LIKE '%TAX%'

  1. Select * from tbl1 
    WHERE ([TextCol] NOT LIKE '%TAX%') AND ([TextCol] NOT LIKE '%TAX%')
    
  2. select * from tbl1
    where [TextCol] NOT LIKE '%TAX%' OR [TextCol] IS NULL
    

NULL 값도 확인해야합니다.

    [TextCol] NOT LIKE '%TAX%' OR [TextCol] IS NULL

이것은 또한 null 값을 처리해야합니다. 이것이 아마도 출력에서 ​​모든 행을 얻지 못한 이유 일 것입니다.


INnull이있는 간단한 int 열의 연산자 와 동일한 문제가 발생했습니다 . 나는 이것들이 내가 생각한 것처럼 서로 반대가 아닌 것을 발견했습니다. (행 수로 알 수 있습니다)

select * from Dest where id in(select id from Source)
select * from Dest where id NOT in(select id from Source)

서로를 뒤집기 위해 너무 많이 다시 작성했습니다.

select * from Dest where isnull(id,-2)  in(select isnull(id,-1) from Source) 
select * from Dest where isnull(id,-2) NOT in(select isnull(id,-1) from Source) 

참고 URL : https://stackoverflow.com/questions/40376260/not-like-and-like-not-returning-opposite-result

반응형