2015-02-04 6 views
1

이것은 호기심이 많은 질문입니다. 나는이 질문이 이상한 공처럼 보일지는 모르지만, 나는 데이터가 무엇인지 걱정하지 않기 때문에 데이터를 확인할 때 null을 사용하지만, 데이터는 거기에있다. 다음 시나리오는 SQL Server에서만 발생합니다.COUNT (NULL) 및 IN 절

나는 기록이 내가 사용하는 것이다 존재하는지 확인하려는 경우 :

IF((SELECT COUNT(null) FROM Table1 WHERE Criteria = 1) = 2) 

을하지만이 작동하지 않습니다 :

IF(EXISTS(SELECT null FROM Table1 WHERE Criteria IN (1, 2))) 

다음 코드는 작동

IF((SELECT COUNT(null) FROM Table1 WHERE Criteria IN (1,2)) = 2) 

이 오류가 발생합니다.

Operand data type NULL is invalid for count operator.

IN 절 때문에 세 번째 문이 다른 이유는 무엇입니까? 여기

이의 SQL 바이올린입니다 내가 무슨 말 : http://sqlfiddle.com/#!6/6d7db/8

이 IN 절 너무

+0

'COUNT (NULL) '을하는 것은 실제로 당신을 위해 아무것도하지 않고 있습니다. 예를 들어,'COUNT (1)'은하지 않을 것입니다. 질문에 대한 답이 아니라는 것을 압니다 만, 방금'COUNT (1) '을 사용한다면 어떨까요? 허용되는 구문 – Tom

+2

또는 그냥 (*)을 계산하십시오. 그것은 *를 사용하는 몇 안되는 장소 중 하나입니다. –

+0

또한 내부 존재는 완벽하게 수용 가능 select *를 사용하십시오. 모든 작업은 행의 존재 여부를 확인하는 것입니다. –

답변

2

쿼리 최적화 프로그램에 대한 것 같습니다.
처음 두 검색어 (바이올린)에서 count(null)은 실행 계획에서 볼 수 있듯이 COUNT(*)으로 변환 된 것 같습니다. 단 하나의 값이 두 번째 행에

enter image description here

, IN는 상기와 동일한 질의 결과 = 최적화되어 쿼리가 실패

enter image description here

IN (1,2)로. COUNT(1)을 사용하면 동일합니다. COUNT(*)으로 변환되며 쿼리는 한 행만 반환 할 수 있지만 세 번째 행에는 COUNT(1)으로 유지됩니다.

다른 부작용 :이 효과는 실제 테이블에서만 작동합니다.테이블 변수를 사용하면 세 명령문 모두 오류를 발생시킵니다.

결론은 아마되어야합니다 : count(null)잘못 (Heinzi는 설명), 그것은 단지 수도 매우 드문 상황에서 최적화를 통해 슬립.

2

COUNT(null), COUNT(ALL null)의 짧은 형태로 여러 항목이있는 경우에만 좁혀, 단순히 의미가 없습니다. 이제 살펴 at the definition of COUNT (강조 광산)을 보자 :

COUNT(*) returns the number of items in a group. This includes NULL values and duplicates.

COUNT(ALL expression) evaluates expression for each row in a group and returns the number of nonnull values.

COUNT(DISTINCT expression) evaluates expression for each row in a group and returns the number of unique, nonnull values.

따라서, COUNT(ALL someExpressionThatYieldsNull) 항상 WHERE 절에 상관없이 일치하는 레코드 수, 0을 반환하지 않을 것이다. 분명히, 그것은 행을 세는 데 전혀 부적합합니다. COUNT(*)이 여기에 맞습니다.

두 번째 예제가 전혀 작동하지 않는다는 것에 상당히 놀랐습니다. 여기 버그를 발견했을 수도 있습니다. 시도 MSSQL 2012 (SQLFiddle)에서 다음

SELECT COUNT(NULL) FROM someTable; 

다음과 같은 오류를 얻을 : 완벽한 의미가

Operand data type NULL is invalid for count operator.

.