Почему приведение JSONb NULL к типу завершается ошибкой, это ошибка спецификации?

0

Вопрос

Как прокомментировано в этом ответе,

SELECT (j->'i')::int FROM  (SELECT '{"i":null}'::jsonb) t(j); -- fail

приводит к "ОШИБКЕ: не удается привести значение jsonb null к типу integer"... Хорошо, это "способ PostgreSQL", но почему бы не сделать его лучше? Лучше, чем добавить CASE предложения, это делает "естественную" вещь, то есть приводит значение JSON-NULL к типизированному SQL нулевому значению. Итак, это не проблема реализации, но, похоже, ошибка спецификации в PostregSQL: так ли это?

casting jsonb postgresql
2021-11-16 19:53:05
1

Лучший ответ

2

Причина в том, что SQL NULL сильно отличается от JSON null.

Если вы хотите это сделать:

SELECT nullif((j->'i'), 'null')::int FROM  (SELECT '{"i":null}'::jsonb) t(j);
 nullif 
--------
   NULL
(1 row)

 SELECT pg_typeof(nullif((j->'i'), 'null')::int) FROM  (SELECT '{"i":null}'::jsonb) t(j);
 pg_typeof 
-----------
 integer


SELECT nullif((j->'i'), 'null')::int FROM  (SELECT '{"i": 1}'::jsonb) t(j);
 nullif 
--------
      1
(1 row)

Используйте NULLIF для преобразования JSON null в SQL NULL.

2021-11-17 05:29:10

На других языках

Эта страница на других языках

Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................