Странное поведение Oracle: TO_DATE и CONCAT в предложении WHERE

У меня есть несколько сложный SQL-запрос, который извлекается из таблицы счетов-фактур. В запрашиваемой таблице используются три числовых поля для создания даты (одно для дня, месяца и года).

В этом запросе используется комбинация вызовов функций concat внутри функции TO_DATE. В части запроса SELECT проблем нет, но когда я использую идентичный оператор в предложении WHERE, я получаю сообщение «ORA-01858: нечисловой символ был найден там, где ожидалось числовое», которое относится к первому использование concat внутри TO_DATE в предложении WHERE.

Итак, чем отличается использование concat и TO_DATE в предложении where?

Например, следующая часть WHERE вызывает ошибку нечислового символа.

to_date(
  concat(invoice_year,
  concat('-',
  concat(invoice_month, 
  concat('-',invoice_day)))),'YYYY-MM-DD')
  > add_months(sysdate,-6)

но этот оператор в select отлично оценивает

to_date(
  concat(invoice_year,
  concat('-',
  concat(invoice_month,
  concat('-',invoice_day)))),'YYYY-MM-DD') as invoice_date

person Justin C    schedule 03.03.2011    source источник


Ответы (1)


В таблице могут быть строки, которые вызовут ошибку при вычислении выражения TO_DATE; но это не соответствует другим условиям в предложении WHERE.

Когда вы помещаете выражение в список SELECT, оно не оценивается до тех пор, пока строка не пройдет все условия в предложении WHERE.

Когда вы используете выражение в условии, оно может быть оценено раньше других условий, поэтому теперь оно может быть оценено для строк, в которых оно вызывает ошибку.

Обратите внимание, что если у вас есть NULL в любом из этих полей для данной строки, это вызовет ошибку.

person Dave Costa    schedule 03.03.2011
comment
Блестяще! выполнил поиск всех уникальных значений для значений дня, месяца и года. Найдено 4 строки со значениями NULL. Запрос сейчас работает в полном объеме! - person Justin C; 03.03.2011