Как преобразовать sql-текст в jsonb-строку?

Nov 23 2020

Кажется, нет очевидного способа:

  • select 'a123'::text::jsonb= ОШИБКА: недопустимый синтаксис ввода для типа json
  • select '"a123"'::text::jsonb= BAD строка , потому что цитируемая
    проверка , select '"a123"'::text::jsonb = ('{"x":"a123"}'::jsonb)->'x'
    чтобы убедиться , что не цитируемой является правильной .
  • select '123'::text::jsonb = ('{"x":123}'::jsonb)->'x';= НЕ строка

Мне нужны «123» и «a123» как чистые строки JSONb .


PS: это не дубликат универсального автоматического преобразования .

Ответы

1 ErwinBrandstetter Nov 23 2020 at 20:10

Чтобы преобразовать нетипизированные строковые литералы , не заключенные в двойные кавычки, в jsonb(или json), используйте функцию to_jsonb()(или to_json()):

SELECT to_jsonb(text 'a123');

Обратите внимание , что вход должен быть строковый тип ( text, varchar, ...), а не нетипизированная буквальным. Вот как Postgres знает, что вам нужна строка JSON .

Вышеупомянутый text 'a123'- один из способов привести нетипизированный литерал. Есть и другие:

  • Приведение типа данных Postgres

Для прямого преобразования json(b)Postgres ожидает допустимые литералы JSON (со строками в двойных кавычках ):

SELECT '"a123"'::jsonb;  

Чтобы преобразовать каждое значение в определенный примитив JSON, перед преобразованием можно выполнить условное приведение. Пример:

SELECT p, CASE WHEN i>2 THEN to_jsonb(p::numeric) ELSE to_jsonb(p) END AS x
FROM   unnest('{ab,12,12,1.2}'::text[]) WITH ORDINALITY t(p,i);

select '"a123"'::text::jsonb = ПЛОХАЯ строка, поскольку заключена в кавычки

Если быть точным, результатом будет не строка, а jsonbзначение, содержащее строку JSON. Чтобы получить строку как тип данных Postgres text, вам понадобится ->>оператор:

select 'a123'::text  = ('{"x":"a123"}'::jsonb)->>'x'

Или (сравнивая значения JSON):

select '"a123"'::jsonb = ('{"x":"a123"}'::jsonb)->'x';

Мне нужны «123» и «a123» как чистые строки JSONb.

Так:

SELECT '"123"'::jsonb, '"a123"'::jsonb;

Оба содержат строки JSON .

Это тоже работает:

SELECT '123'::jsonb;

.. но содержит числовой формат JSON .

Но это не работает:

SELECT 'a123'::jsonb;  -- error

.. потому что это недопустимый числовой литерал.

В руководстве есть таблица сопоставлений между примитивными типами JSON и соответствующими типами PostgreSQL.