2010-02-04 6 views
3

단일 열 n이있는 NUMS라는 테이블이 있습니다.
그리고 1,2,3,4,5 값을 채 웁니다.IN 연산자

이 경우 이제 쿼리

SELECT n FROM Nums 
WHERE n IN (1, 2, null) 

을 나는 그것이

SELECT n FROM Nums 
Where n = 1 OR n = 2 OR n = null 

나는 또한 알을 산출한다 null 값과 N을 비교하고 그것이 빈 집합을 반환해야 변환 같아요. 하지만 1,2를 반환합니다. (IN 연산자에 포함되어 있지만 null은 반환되지 않습니다.)

이제 쿼리

나는이 작품의 위 말했다 그것은 아무것도 반환하지 않는 것을 여기

SELECT n FROM Nums 
Where n!=1 AND n!=2 AND n!=null 

:

SELECT n FROM Nums WHERE n NOT IN(1, 2, null) 

...은로 변환됩니다.

누구나 무슨 일이 일어나는지 자세히 설명 할 수 있습니까?

답변

2

OK 나는 항상 알 수없는 것입니다

SELECT n FROM Nums 
n!=1 AND n!=2 AND n!=null 

에 마지막 비교의 결과를

SELECT n FROM Nums  
WHERE n NOT IN (1, 2, null) 

는 평가 해답을 발견했다.
AND의 진리표는 하나의 Unknown이 (U, T) (U, F), (U, U)로 호출 되 자마자 reult는 U 또는 F (U = Unknown, F = 거짓) 결과 집합에 포함되지 않습니다.

SELECT n FROM Nums 
WHERE n IN (1, 2, null) 

경우

만큼 이루어질 N = 1, 동작 N = 1 인 행하기

SELECT n FROM Nums 
WHERE n = 1 OR n =2 OR n=null 

총점
및 N과 행 = 2 일 때, 연산 n = 2는 참이 될 것입니다.
그리고 모든 행에 대해 n = null은 알 수 없습니다.

따라서 1과 결과 세트에서 2.
희망 사람들은 그것을 좋아했습니다.
누구

+0

만이 답으로이를 표시 할 수 있습니다 확인하시기 바랍니다 반환, 당신은 당신이 할 수있는 이틀 전에 기다려야한다. –

0

또한 n을 알 수없는 null 값과 비교하고 빈 세트를 반환해야합니다.

당신이 NULL로 가득 추가 행에 필요한 경우이 값 가장 좋은 방법은 IMO입니다 안 :

SELECT n FROM Nums WHERE n IN(1,2) 
UNION 
SELECT NULL 

이제 쿼리

Nums FROM

SELECT N 여기서 n NOT IN (1, 2, null)

...

여기 내가 위에서 말한 것은 작동하며 아무것도 반환하지 않습니다.

그게 오른쪽 아무 IN 연산자에 포함되지만, NULL하고 NULL 비교 대해 NULL 문

+0

I이 N == 1 또는 N = 2 또는 N = NULL 모든 N 같이 각 N (1,2,3,4,5, 널)를 비교하고 ANSWER AS MY REPLY 표시 주실 n = null은 모든 n에 대해 UNKNOWN을 반환하므로 unknown을 반환합니다. 같은 (true/false) OR (true/false) 또는 (Unknown) 각 n에 대해. 그러면 알 수없는 결과가 나오며 궁극적으로 빈 세트가 반환됩니다. –

+0

그래서? 나는 그것을 안다. 나는 대답했다. "안된다." – zerkms

+0

NUn에서 SELECT n n (null, 1,2); 1과 2가 반환됩니다. 확인하십시오. –

1

널이 복귀되지 않고 사용된다 동일 할 수 있기 때문에의

n = NULL 평가; NULL은 과 같음 NULL이 될 수 없습니다. NULL 행/레코드를 리턴하려면 n IS NULL (또는 이와 유사한 유사한 구문)으로 처리해야합니다.

+0

는 IN으로 연결된 AND =이되지 1,2,3,4,5의 집합에 쿼리, 모든 레코드를 반환해야합니다 NULL, 이유는! 1 = 1 (거짓) OR 1 = 2 (참) - > 2 = 1 (참)! -> 등 – zerkms

+0

N == 1 또는 n = 2 또는 N = null이 당신은 내가 그래서 빈 집합을 반환해야 널 으로 모든 N (들)을 비교하고 볼에 . N IN (1,2) 또는 n은 또한 중복 –

1

null과 직접 비교할 수 없습니다.컬럼의 값이 null인지 여부를 확인하려면, 당신은이 라인을 따라 뭔가를 사용해야합니다

SELECT n 
FROM Nums 
WHERE n IS NULL 
5

null = null 당신은을 IS 또는 IS NOT 사용할 수 있습니다 널에 사용하는 연산자는 항상 false이기 때문입니다 예상 출력 아래 쿼리

SELECT n FROM Nums WHERE n IN (1,2) OR n IS NULL 
는 는

[편집] 고맙습니다 @Buckwad는 IN리스트는 NULL 값 anyw 포함

+0

ALL 술어는 결코 – zerkms

+0

내가이 간단하게 작성 더 생각 NULL이 될 수 없습니다 때문에 첫번째 쿼리에서 "N"여기 ambuguous입니다 : P – Damon

+0

그 NULL IS Nums FROM SELECT N : –

0

하면 당신이 NULLNULL을 비교할 때 여기에 전체 목록의 결과가, ANSI NULLS의 올바른 기본으로 UNKNOWN

입니다 결과 사실이 아니다, 그러나 UNKNOWN

+0

NUMS에서 n을 선택 n IN (null, 1,2); 1과 2 –

0
SELECT n FROM Nums 
WHERE n IN (1, 2) 
    Or n Is null 

이것은 당신이하려는 것을 검색합니다 도망. Mitch가 일반적으로 Null과 비교했을 때 말한 것처럼 UNKNOWN을 산출합니다. 이것은 NULL 자체가 정의되지 않은 값으로 정의되기 때문입니다. 그것은 내가 노팅엄, 버밍엄과 어딘가에 살았다는 것과 같습니다. 세계지도에서 어딘가를 찾는 것은 그것이 정의되지 않았기 때문에 조금 까다로울 수 있습니다.