开发者

Oracle NVL problem

I'm trying to pass a null value as something else in my db and it seems to work without a Where clause like so

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

produces this

    0   test1
    0   test2   
    1   test3

But when I add the where clause like so

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

it produces this

    1   test3

But now if I add the following to the query it works

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

Bu开发者_C百科t it seems like a long way round to get the value to show correctly with a Where clause

Any ideas what i'm doing wrong?

Thanks in advance


You cannot refer to an alias defined in the SELECT list from the WHERE clause. So if you apply the NVL function in the SELECT list, you'd need the same function call in the WHERE clause (as you've demonstrated) or you would need to apply the function in an inline view

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

Note that for general sanity, if COLUMN1 is a NUMBER, the second parameter to NVL should also be a NUMBER. Otherwise, you're going to do implicit conversions and your comparison operations may end up using string comparison semantics rather than numeric comparison semantics. Since the string '12' is less than the string '2', that can lead to unexpected results.


you have shown the correct way.

an alternative would be to say

OR column IS NULL
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜