Является ли преобразование jsonb в текст детерминированным? - PullRequest
2 голосов
/ 24 октября 2019

Это короткая версия слишком длинного вопроса , который, к сожалению, не получил ответов.

Возможно ли, учитывая две переменные jsonb x и y, иметь оба значения
1. (x = y) возвращает true, а
2. (x :: text = y :: text) возвращает false

Я задаю этот вопрос, поскольку, как представляется, нет обещанного порядка, в котором jsonbОбъект будет распакован в строку. Я просто хотел бы убедиться, что это так.

Заранее спасибо за отзыв!

Редактировать:

Оригинальный вопрос охватывает «почему» для этого вопроса, но то, что я думаю, состоит в том, что я надеюсь сгруппировать данные в разных строках на основе хеша многих столбцов, представленных в виде текста, некоторые из которых являются jsonb.

Мне все равно, каким образом поступает объект или какиекак это распаковывается, но мне все равно, если два поля jsonb, которые эквивалентны как jsonb, не эквивалентны текстовым строкам.

Поскольку это кажется Я не могу рассчитывать на текстовые представления, которые будут представлены втаким же образом я нормализовал поле jsonb в отдельной таблице с полем jsonb, установленным в качестве уникального индекса.

И если я напишу больше здесь ... этот вопрос приблизится к длине одногоэто происходит от!

1 Ответ

0 голосов
/ 24 октября 2019

Формально порядок не является детерминированным из-за определения объекта JSON:

Объект - это неупорядоченный набор пар имя / значение.

Практически получается, что объекты сортируются по длине ключей, а затем в алфавитном порядке:

with example(col) as (
values 
    ('{"cc": 1, "ab": 1, "a": 1, "aa": 1, "b": 2, "abc": 1}'::jsonb)
)

select col::text
from example

                          col                          
-------------------------------------------------------
 {"a": 1, "b": 2, "aa": 1, "ab": 1, "cc": 1, "abc": 1}
(1 row)

Обратите внимание, что это поведение недокументировано и может измениться в будущих выпусках (хотя это может показатьсямаловероятно).

...