2011-09-13 177 views
2

我想传递一个空值否则在我的分贝的东西,它似乎没有Where条款的工作,像这样甲骨文NVL问题

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

产生这种

0 test1 
    0 test2 
    1 test3 

但是,当我想补充的where子句,像这样

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

它产生这个

1 test3 

但现在,如果我添加以下查询它的工作原理

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

但它似乎是一个很长的路轮获得价值与Where条款正确显示

任何想法我做错了什么?

在此先感谢

+2

为什么''0''而不是'0'? –

回答

8

你不能指从WHERE子句SELECT列表中定义的别名。所以,如果你在SELECT列表应用NVL功能,你需要的WHERE子句中的相同的函数调用(如你证明),或者你需要在内嵌视图

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

应用功能请注意,对于一般的理智,如果COLUMN1NUMBERNVL的第二个参数也应该是NUMBER。否则,您将执行隐式转换,并且您的比较操作最终可能会使用字符串比较语义而不是数字比较语义。由于字符串'12'小于字符串'2',这可能会导致意外的结果。

+0

感谢您的解释是有道理的:) –

3

你已经显示了正确的方法。

另一种是说

OR column IS NULL