2016-07-18 4 views
3

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

То, что я попытался это:

  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 

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

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

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

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

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

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

ответ

5

Оператор ->> дает текст в результате. Используйте -> если вы хотите 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; 
2

Или лучше, тем не менее, использовать operator #>>:

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

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

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

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