2011-11-09 6 views
2

는 다음과 같이 NULL로 변수를 비교하는 것은 불가능하다 :SQL에서 CASE WHEN NULL에 대한 특별한 처리가없는 이유는 무엇입니까? SQL에서

CASE x WHEN NULL THEN y ELSE z END 

때문에 세 가지 값 SQL 로직, x = NULL 것이다 결코 true를 돌려줍니다. 하나는 대신이 작업을 수행 할 수 있습니다

CASE WHEN x IS NULL THEN y ELSE z END 

x는 예를 들어, 데이터를 수정하는 절차의 결과 인 경우이 문제가 :

CASE WHEN func(i) IS NULL THEN y 
    WHEN func(i) = 'a' THEN z 
    ELSE      t 
END 

그래서 ... func(i) 두 번 평가됩니다은? CASE ... WHEN NULLIS NULL 연산자를 사용하여 평가 된 표현식을 NULL과 비교한다는 표준 요구 사항이없는 이유는 무엇입니까?

이러한 구조를 허용하는 DBMS가 있습니까?

+0

func (i)의 결과를 보유하는 임시 변수를 도입하고 사례문에서 사용할 수 있습니까? –

+0

'WHEN' 이후의 값이 단지 리터럴이라는 보장이 없으므로 더 많은 불일치가 발생하거나 NULL == NULL이되도록 SQL을 다시 작성하지 않고 특별한 경우에 대한 간단한 방법은 없습니다. 예 : 만약 표현식이'CASE func (i) WH1 Col1 THEN ... '이고'Col1'이 어떤 행에서는 null이지만 다른 행에서는 그렇지 않다면. –

답변

2

당신은 리터럴 때 이후의 값이 그 NULL == NULL, 그래서 더 일관성, 또는 재 작성 SQL을 도입하지 않고 특별한 경우에 간단한 방법이 없다는 것을 보장하지 않는 때문에.

예. 표현식이 CASE func(i) WHEN Col1 THEN...이고 Col1이 일부 행에서는 null이지만 다른 행에는없는 경우 ...

3

이것은 NULL이 악의에 찬 이유 중 하나 일뿐입니다.

CASE COALESCE(func(i), 'nada') WHEN 'nada' THEN y WHEN 'a' THEN z ELSE t END 
+0

나는 이것을 위해 guid를 사용하고 싶지만 이것은 좋은 생각이다. – Benoit

+0

@Benoit : 예, GUID가 좋은 선택입니다. –

1

난 당신이 할 수있는 case 문에이 문제를 해결받을 수있는 RDBMS 잘 모르는 것 같아요 : 한 가지 작업은 NULL에 대한 대리로 마법의 값을 선택하는 것입니다.

오라클에서는 디코드 기능을 교체 할 수 있습니다 : 널 하다니

decode(func(i), null, 'y', 'a', 'z') 

를 = 널 정상적인 SQL입니다, 당신의 논리 내에서 디코드 문을 사용하는 경우가 동일한 것으로 간주됩니다!.

+0

감사합니다.'DECODE'는 실제로 그것을 올바르게 처리하는 함수입니다. 불행하게도 Tom은 [사용하지 말 것을] 권장합니다. (http://asktom.oracle.com/pls/apex/f?p=100:11:0%3a%3a%3a%3aP11_QUESTION_ID:1243867216406) – Benoit

+0

돌아 오는 길 때 사용되지 않는,하지만 여전히 11gr2 제거하지, 난 여전히 있지만, 때문에 이식성의 이유로 필자는 개인적 디코드를 사용하지 마십시오 (12)에서 제거되지 않습니다 의심됩니다. – Andrew