2010-02-25 1 views
7

select 문에서 varchar 값이없는 행 수를 계산할 때 이상한 상황이 발생했습니다. 그래, 나에게 혼란스러워하는 소리가 들리니, 예를 들어 보겠다.COUNT() NOT IN 절과 결합 된 함수가 varchar 필드 (T-SQL)에서 제대로 작동하지 않습니다.

"SomeTable"필드에 "MyField"라는 필드가 있고 MyField 값이 MyField 값에 속하지 않는 행의 수를 계산하려고한다고 가정 해 보겠습니다. 도메인은 "SomeOtherTable"의 "MyOtherField"값으로 정의됩니다. 즉, MyOtherField = {1, 2, 3}이 있다고 가정하고, MyField 값이 1, 2 또는 3이 아닌 행 수를 계산하고 싶습니다. 다음 쿼리를 사용합니다.

SELECT COUNT(*) FROM SomeTable 
WHERE ([MyField] NOT IN (SELECT MyOtherField FROM SomeOtherTable)) 

그리고 그것은 매력처럼 작동합니다. 그러나 MyField 및 MyOtherField는 int 유형입니다. varchar 형식의 필드를 제외하고 정확히 동일한 쿼리를 실행하려고하면 잘못된 값이 있음을 알고 있지만 반환 값은 0입니다. 그러나 만약 내가 위의 질의에 "NOT"절을 단순히 남겨둔 채로 반대쪽 (얼마나 많은 행이 내가 원하는지에 반대하는 도메인에 얼마나 많은 행이 없는지)을 계산하려고하면 ... THAT 공장! ¬¬

네,이 문제에 대한 엄청난 해결 방법이 있어야합니다. 그렇지만 왜 그렇게 작동하지 않는지 알고 싶습니다. 또한 C# 코드 내부에 대부분의 쿼리가 포함되어 있기 때문에 전체 쿼리를 간단히 변경할 수는 없으며 기본적으로 소프트웨어의 다른 부분에 영향을 미치지 않을 변경 권한이있는 유일한 부분은 도메인에 해당합니다 (NOT IN 절에 포함 된 모든 것). 나는 나 자신을 분명히하고 거기에있는 누군가가 나를 도울 수 있기를 바란다.

미리 감사드립니다.

+1

해당 필드에 대해 "SomeOtherTable"에 NULL 표시가 있습니까? –

답변

6

NOT IN의 경우 하위 쿼리가 NULL 값을 반환하면 항상 false입니다. this question에 대한 대답은 그 이유를 우아하게 설명합니다.

열 값의 Null 허용도 사용되는 데이터 타입의 독립적 인 : 가장 가능성이 VARCHAR 컬럼이 처리 마십시오 NULL 값

을 가지고, NOT EXISTS 사용할 수 있습니다. null 이외의 값의 경우, 그렇게

SELECT COUNT(*) FROM SomeTable S1 
WHERE NOT EXISTS (SELECT * FROm SomeOtherTable S2 WHERE S1.[MyField] = S2.MyOtherField) 
+0

감사합니다. NOT EXISTS 절과 함께 제안 된 쿼리를 사용하면 내가 원하는 것을 멋지게 완성했습니다. –

0

GBN이 더 완전한 해답을 가지고 호환 NOT IN과 동일하게 작동하지만, 나는 모든 것을 기억하는 것이 방해 할 수 없습니다. 대신 내 IN 절에서 널 (null)을 필터링하는 종교적인 습관이 있습니다.

SELECT COUNT(*) 
FROM SomeTable  
WHERE [MyField] NOT IN (
    SELECT MyOtherField FROM SomeOtherTable 
    WHERE MyOtherField is not null 
) 
관련 문제