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
보시다시피 데이터베이스는 NULL
18보다 크거나 같은지 결정할 수 있습니다 .
(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%'
Select * from tbl1 WHERE ([TextCol] NOT LIKE '%TAX%') AND ([TextCol] NOT LIKE '%TAX%')
select * from tbl1 where [TextCol] NOT LIKE '%TAX%' OR [TextCol] IS NULL
NULL 값도 확인해야합니다.
[TextCol] NOT LIKE '%TAX%' OR [TextCol] IS NULL
이것은 또한 null 값을 처리해야합니다. 이것이 아마도 출력에서 모든 행을 얻지 못한 이유 일 것입니다.
IN
null이있는 간단한 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
'programing' 카테고리의 다른 글
Phoenix 서버가 실행 중일 때 컨트롤러에 무언가를 로그인하는 방법은 무엇입니까? (0) | 2020.12.12 |
---|---|
AngularJS POST 실패 : 프리 플라이트에 대한 응답에 잘못된 HTTP 상태 코드 404가 있습니다. (0) | 2020.12.12 |
펑터가 실제로 함수에 대한 포인터보다 빠릅니까? (0) | 2020.12.12 |
원사로 글로벌 패키지를 설치하는 방법 (0) | 2020.12.12 |
applicationContext를 여러 파일로 분할 (0) | 2020.12.12 |