Как полностью преобразовать текст в jsonb для столбца postgresql

У меня есть текстовый столбец в Postgresql, который я хочу преобразовать в столбец JSONB.

Я пробовал вот что:

  1. CREATE TABLE test (id serial, sec text, name text);
  2. INSERT INTO test (id, sec, name) VALUES (1,'{"gender":"male","sections":{"a":1,"b":2}}','subject');
  3. ALTER TABLE test ALTER COLUMN sec TYPE JSONB USING sec::JSONB;

Это преобразовало текстовый столбец в jsonb.

Однако, если я попытаюсь запросить:

 SELECT sec->>'sections'->>'a' FROM test

Я получаю сообщение об ошибке.

Я вижу, что преобразование выполняется только на одном уровне (то есть: sec - >> 'section' отлично работает).

Запрос SELECT pg_typeof(name->>'sections') from test; дает мне тип столбца в виде текста.

Есть ли способ полностью преобразовать текст в jsonb, чтобы я мог успешно запросить SELECT sec->>'sections'->>'a' FROM test;?

Я не хочу преобразовывать текст в json в запросе, как показано ниже, так как мне нужно создать индекс для «a» позже.

select (sec->>'sections')::json->>'a' from test;

person Ishwar    schedule 18.07.2016    source источник


Ответы (2)


Оператор ->> выдает в результате текст. Используйте ->, если хотите jsonb:

select 
    pg_typeof(sec->>'sections') a,
    pg_typeof(sec->'sections') b
from test;

  a   |   b   
------+-------
 text | jsonb
(1 row) 

Использовать:

select sec->'sections'->>'a' 
from test;
person klin    schedule 18.07.2016

Или еще лучше используйте оператор < strong> #>>:

SELECT sec #>> '{sections,a}' FROM test;

И чтобы использовать это в индексе выражения, вам потребуются дополнительные круглые скобки:

CREATE INDEX foo ON test ((sec #>> '{sections,a}'));

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

person Erwin Brandstetter    schedule 18.07.2016