Я пытаюсь понять обработку null
с PostgreSQL jsonb
типа. Из-за
# select 'null'::jsonb is null;
?column?
----------
f
(1 row)
Я предполагаю, что они отличаются от SQL null
с (что имеет смысл) - в соответствии с руководством ,
SQL NULL - это другое понятие.
Поэтому эти два запроса совсем не удивительны:
# select '{"a": 1, "b": null}'::jsonb->'b' is null;
?column?
----------
f
(1 row)
# select '{"a": 1, "b": null}'::jsonb->'c' is null;
?column?
----------
t
(1 row)
за руководство :
Операторы извлечения поля / элемента / пути возвращают NULL, а не сбой, если вход JSON не имеет правильной структуры для соответствия запросу; например, если такого элемента не существует.
Где начинается сюрприз, однако, это:
# select '{"a": 1, "b": null}'::jsonb->>'b' is null;
?column?
----------
t
(1 row)
# select '{"a": 1, "b": null}'::jsonb->>'c' is null;
?column?
----------
t
(1 row)
Последний, который я могу понять - мы получаем SQL null
от извлечения, и приведение null
к text
оставляет это как null
- я предполагаю, что ->>
работает таким образом, поскольку руководство говорит
Операторы извлечения поля / элемента / пути возвращают тот же тип, что и их левый ввод (либо json, либо jsonb), за исключением тех, которые указаны как возвращаемый текст, которые приводят значение к тексту.
(Кстати, я не смог найти подтверждения, что приведение SQL null
к любому другому типу дает null
снова в PostgreSQL - это написано где-то явно?)
Но первое для меня загадка Извлечение должно дать мне jsonb
null
, и я подумал, что приведение к text
должно дать мне 'null'
(т. Е. Строку, говорящую "null"), как
# select ('null'::jsonb)::text;
text
------
null
(1 row)
Но все же он возвращает правильное значение SQL null
.
Почему это так?