2011-09-13 3 views
2

내 DB에서 다른 뭔가로 null 값을 전달하기 위해 노력하고있어 및 너무오라클 NVL이 문제

select NVL(column1, '0') column1 from table1 

같은 Where 절없이 작동하는 것 같다가 생산이

0 test1 
    0 test2 
    1 test3 

그러나 때 나는이

,536을 생산하고 그래서

select NVL(column1, '0') column1 from table1 where column1 <=1 

같은 곳에 절을 추가

1 test3 

그러나지금은 추가하면 라운드 Where 절을 제대로

어떤 아이디어를 표시하는 값을 얻을 수는

select NVL(column1, '0') column1 
from table1 
where NVL(column1, '0') <=1 

작동하지만 먼 길처럼 보인다 쿼리에 다음과 같은 내가 뭘 잘못하고있어? 사전

+2

왜 ''라고 0'' 대신'0'을

대안은 있을까? –

답변

8

당신은 WHERE 절에서 SELECT 목록에 정의 된 별칭을 참조 할 수 없습니다에

감사합니다. 당신이 SELECT 목록에 NVL 함수를 적용한다면, 당신은 WHERE 절에 같은 함수 호출을해야 할 것 (당신이 증명 한 바와 같이) 또는 인라인 뷰

SELECT column1 
    FROM (SELECT nvl(column1, 0) column1 
      FROM table1) 
WHERE column1 <= 1 

에서 함수를 적용해야 일반적인 정성을 위해 COLUMN1NUMBER 인 경우 NVL의 두 번째 매개 변수도 NUMBER이어야합니다. 그렇지 않으면 암시 적 변환을 수행 할 것이고 비교 연산은 숫자 비교 구문보다는 문자열 비교 구문을 사용하여 끝나게 될 것입니다. 문자열 '12'가 문자열 '2'보다 작기 때문에 예기치 않은 결과가 발생할 수 있습니다.

+0

설명 주셔서 감사합니다 :) –

3

올바른 방법을 제시했습니다.

OR column IS NULL