Я использую Postgres 9.1. Следующий запрос не работает должным образом. Coalesce должен вернуть первое ненулевое значение. Однако этот запрос возвращает null (1?) вместо даты (2).
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, даже если его выбор возвращает null.
[PS: зачеркнуто выше, чтобы не вводить в заблуждение. В Postgres нет ошибки, но он не считает пустые строки нулевыми. См. ответ.]
to_date('', 'yyyymmdd')
равно0001-01-01 BC
. Как вы думаете, почемуto_date('', 'yyyymmdd')
должно быть NULL? В документации дляto_date
нигде не упоминается значение NULL. Я не могу найти никаких упоминаний о том, что делаетto_date
, если в строке не упоминается шаблон, но я сделал только беглый обзор. У меня нет копии стандарта под рукой, поэтому я не знаю, что он должен сказать. - person mu is too short   schedule 01.07.2013to_date('00000000', 'yyyymmdd')
также равно0001-01-01 BC
, поэтому, возможно, отсутствует означает ноль. - person mu is too short   schedule 01.07.2013to_date('',...)
не имеет смысла бытьNULL
; вы даете ему ненулевой ввод. Во всяком случае, это должна быть ошибка. выбор его дает ненулевой (но все же ужасный) результат0001-01-01 BC
. Здесь нет доказательств наличия ошибки, и из вашего поста не ясно, что именно вы думаете об этой предполагаемой ошибке, поскольку вы не определяете точное ожидаемое поведение. Вы ожидаете, что PostgreSQL будет обрабатывать пустую строку и null как одно и то же? - person Craig Ringer   schedule 01.07.2013psql
, и вы получите ожидаемый результат:SELECT to_date('','yyyymmdd');
возвращает0001-01-01 BC
, допустимую и разумную дату. Лично я думаю, что он должен возвращать ошибку, но поскольку это не так, клиент должен принять результат. Похоже, клиенту, который вы используете, может понадобиться помощь в понимании этой даты; что делаетSELECT DATE '0001-01-01 BC';
в клиенте? Немного пугает то, что ваш инструмент преобразует результат вNULL
с предупреждением, это почти уровень хитрости, подобный MySQL. - person Craig Ringer   schedule 01.07.2013:)
- person ADTC   schedule 01.07.2013