Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / pg_typeof() слабовато работает / 7 сообщений из 7, страница 1 из 1
12.12.2016, 09:17
    #39364653
PCContra
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
pg_typeof() слабовато работает
Добрый день всем!

Задача сначала стояла так:
Код: sql
1.
INSERT INTO mytable(date) SELECT CASE WHEN '$d' = '' THEN NOW() ELSE '$d'::DATE END



где после подстановки вместо $d может быть либо пустая строка '', либо '2016-12-12'
Первый вопрос: зачем постгрес выполняет вторую часть ветки ('$d'::DATE), если выполняется условие '' = '', и ругается, что пустую строку невозможно привести к типу date

Второй вопрос:
Хотел проверить через pg_typeof и вот:
Код: sql
1.
pg_typeof()

работает с цифрами, а вот
Код: sql
1.
SELECT pg_typeof(' ')

выдает unknown
?


--
Россия - отличная страна!
...
Рейтинг: 0 / 0
12.12.2016, 09:21
    #39364658
Alex__kK
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
pg_typeof() слабовато работает
PCContra,

Таки я подозреваю, что он не на '$d'::DATE ругается, а на '$d' = '', и здесь он как раз к '' к дате не может привести
...
Рейтинг: 0 / 0
12.12.2016, 09:28
    #39364667
Alex__kK
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
pg_typeof() слабовато работает
Alex__kK,

А нет, прочитал по диагонали....

Скорее всего, он следит, чтобы вывод CASE был оного типа во всех ветвлениях.
...
Рейтинг: 0 / 0
12.12.2016, 11:04
    #39364741
big-trot
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
pg_typeof() слабовато работает
PCContra,
Может ругается таблица, в поле которой идет вставка пустой строки, а тип данных у этого поля DATE.
...
Рейтинг: 0 / 0
12.12.2016, 11:44
    #39364765
Melkij
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
pg_typeof() слабовато работает
Код: sql
1.
SELECT pg_typeof(' ')


На этом этапе выполнения - это именно unknown.
Строка задана литералом, pg не знает, допустимо ли её уже считать текстом, или позднее она окажется чем-нибудь ещё. Вот литерал и числится как unknown, "решу, что это такое как-нибудь потом"

Код: sql
1.
зачем постгрес выполняет вторую часть ветки ('$d'::DATE), если выполняется условие '' = '', и ругается, что пустую строку невозможно привести к типу date


https://www.postgresql.org/docs/current/static/sql-expressions.html#SYNTAX-EXPRESS-EVAL
Константа к требуемому типу данных будет приведена на этапе планирования, а не выполнения. Там же на этапе планирования и говорит, что такое делать нельзя.

Проверьте это на приложении. Или используйте нормальный NULL вместо пустой строки.
Код: sql
1.
select coalesce($d, now());


Ну хотя бы так:
Код: sql
1.
select coalesce((case when '$d' = '' then null else '$d' end)::timestamptz, now());


Если ваше приложение даже null передавать не может.
...
Рейтинг: 0 / 0
12.12.2016, 15:20
    #39364965
PCContra
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
pg_typeof() слабовато работает
Код: sql
1.
INSERT INTO t(d) SELECT coalesce((case when '2016-11-12' = '' then null else '2016-11-12' end)::DATE, now());



Работает!

Спрашивается, зачем такие сложности?)
...
Рейтинг: 0 / 0
12.12.2016, 16:43
    #39365077
vyegorov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
pg_typeof() слабовато работает
Melkij
Код: sql
1.
select coalesce((case when '$d' = '' then null else '$d' end)::timestamptz, now());


Можно так:
Код: sql
1.
SELECT coalesce(nullif('$d','')::timestamptz, now());
...
Рейтинг: 0 / 0
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / pg_typeof() слабовато работает / 7 сообщений из 7, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]