Я использую Postgres 9.1. Следующий запрос не работает должным образом. Coalesce должен вернуть первое непустое значение . Однако этот запрос возвращает null (1?) Вместо даты (2).Coalesce and Case-When с To_Date не работает должным образом (ошибка Postgres?)
select COALESCE(
TO_DATE('','yyyymmdd'), --(1)
TO_DATE('20130201','yyyymmdd') --(2)
);
--(1) this evaluates independently to null
--(2) this evaluates independently to the date,
-- and therefore is the first non-null value
Что я делаю неправильно? Любое обходное решение?
Редактировать: Это не может иметь ничего общего с Coalesce. Я пробовал некоторые эксперименты с конструкциями Case When; получается,
Postgres имеет этот
большой уродливый баг
, где он рассматривает TO_DATE('','yyyymmdd')
как не пуст, хотя выбор его возвращает null.
[PS: Забастовка выше, чтобы не вводить в заблуждение. Postgres не имеет ошибки, но не обрабатывает пустые строки как null. См ответ.]
В 9.0, 'to_date ('' , 'yyyymmdd') '' '0001-01-01 BC'. Почему вы думаете, что 'to_date ('', 'yyyymmdd')' должно быть NULL? [Документация для 'to_date'] (http://www.postgresql.org/docs/current/interactive/functions-formatting.html) нигде не упоминает NULL. Я не могу найти никакого упоминания о том, что делает 'to_date', если строка не упоминает шаблон, но я только сделал беглый обзор. У меня нет стандартной копии, поэтому я не знаю, что она должна сказать. –
Кроме того, стоит отметить, что 'to_date ('00000000', 'yyyymmdd')' также '0001-01-01 BC', поэтому, возможно, * missing * означает * zero *. –
Не имеет смысла для 'to_date ('', ...)' быть 'NULL'; вы даете ему ненулевой ввод. Если что-то должно быть ошибкой. «Выбор его» создает ненулевой (но все еще ужасный) результат '0001-01-01 BC'. Здесь нет никаких признаков ошибки, и из вашего сообщения неясно, что вы думаете, что это предполагаемая ошибка, поскольку вы не определяете точное поведение, которое вы ожидаете. Вы ожидаете, что PostgreSQL будет обрабатывать пустую строку и null как одно и то же? –