Проблема Oracle NVL - PullRequest
       3

Проблема Oracle NVL

2 голосов
/ 13 сентября 2011

Я пытаюсь передать нулевое значение как что-то еще в моей базе данных, и кажется, что он работает без предложения Where, например,

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 ]

8 голосов
/ 13 сентября 2011

Нельзя ссылаться на псевдоним, определенный в списке SELECT из условия WHERE. Поэтому, если вы применяете функцию NVL в списке SELECT, вам потребуется такой же вызов функции в предложении WHERE (как вы продемонстрировали), или вам нужно будет применить функцию во встроенном представлении

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

Обратите внимание, что для общего здравого смысла, если COLUMN1 равно NUMBER, вторым параметром NVL также должен быть NUMBER. В противном случае вы будете выполнять неявные преобразования, и ваши операции сравнения могут в конечном итоге использовать семантику сравнения строк, а не семантику числового сравнения. Поскольку строка «12» меньше строки «2», это может привести к неожиданным результатам.

3 голосов
/ 13 сентября 2011

вы указали правильный путь.

альтернативой было бы сказать

OR column IS NULL
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...