Странное поведение Oracle: TO_DATE и CONCAT в предложении WHERE - PullRequest
4 голосов
/ 03 марта 2011

У меня несколько сложный 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)

, но этот оператор в выборе оценивается просто отлично

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

1 Ответ

7 голосов
/ 03 марта 2011

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

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

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

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

...