2011-10-10 1 views
1

나는 데이터베이스의 필드의 변화를 감지하는 트리거를 쓰고, 그리고 난 그냥왜 NULL 필드가 동일하게 호출 되나요?

(SELECT SalesPrice FROM __old) <> (SELECT SalesPrice FROM __new) 

정확하게 필드가있는 경우 감지

(SELECT SalesPrice FROM __old) <> (SELECT SalesPrice FROM __new) 
or ((SELECT SalesPrice FROM __old) IS NULL and (SELECT SalesPrice FROM __new) IS NOT NULL) 
or ((SELECT SalesPrice FROM __old) IS NOT NULL and (SELECT SalesPrice FROM __new) IS NULL) 

보다는처럼 정말 불쾌한 일을 할 필요가 나타납니다 변경되었습니다.

뭔가 누락 되었습니까? 아니면 Advantage가 효과적으로 NULL == 값을 요구합니까? 이 행동에 대한 좋은 이유가 있습니까? 이것은 SQL 정의에서 이상한 일입니까? 더 간결한 방법이 있습니까?이 방법은 3 가지 검사를 하나씩 수행하지 않습니다.

답변

3

이것은 유감스럽게도 SQL이 NULL 값과 함께 작동하는 방식입니다. NULL이 아무 것도 아닌 경우 UNKNOWN입니다. A : 예를 들어, someValue와는 == NULL - -> 알 수없는 someValue와 <> NULL> 결과

알 수없는 IT는 "사실은" Null Values - Wikipedia

은 몇 가지 옵션이 있습니다 확인 통과하지 않습니다) 널 (null) 값 (I이 기본값이 결합 권장) B)를 사용 IFNULL 일부 값과 같은

(SELECT IFNULL(SalesPrice, -9999) FROM __OLD) <> (SELECT IFNULL(SalesPrice, -9999) FROM __NEW) 

에 필드를 설정하는 것을 허용하지 않는다 그러나 나는 반드시이 좋아 나도 몰라 유효하지 않은 값을 선택해야하기 때문입니다.

+0

불행하지 않습니다. 그것은 완벽하게 이해합니다. 두 개의 열에 값이없는 경우 그 존재하지 않는 값을 어떻게 비교할 수 있습니까? IEEE NaN 값에서도 동일한 결과를 얻을 수 있습니다. –

+0

@Tomalak 제 문제는 열이 NULL 일 때 SQL은 효과적으로 모든 것이 동일하다고 말합니다. 나는 SQL이 정확히 프로그래밍 언어는 아니지만 NULL 언어가 NULL이라고 가정하는 많은 언어를 알고 있으므로 NULL이 나타날 수있는 비교에서 합리적인 결과를 얻을 수 있습니다. –

+0

@ 에드거 - 경우에 따라 null을 허용하지 않을 수도 있지만 0과 미정 사이에는 차이가 있습니다 (예를 들어). 그러나, 만약 IFNULL이 훌륭하게 작동한다면, 비교할 때 쓸만한 잘못된 값을 쉽게 찾을 수 있습니다. 감사. –

1

SQL에서 NULL은 IS [NOT] NULL 표현식을 제외하고는 아무 것도 비교하지 않습니다. 만약 당신이 정확하게 질문을 이해, 여기서 문제는 NULL이 NULL과 같아야한다는 것입니다. 이 경우 수표는 다음으로 단순화 될 수 있습니다.

(SELECT CASE WHEN n.SalesPrice IS NULL and o.SalePrice IS NULL THEN TRUE 
     ELSE n.SalesPrice = o.SalesPrice END 
    FROM __old o, __new n)