如何将文本完全转换为jsonb for postgresql列

时间:2016-07-18 12:00:17

标签: json postgresql postgresql-9.4 jsonb

我所拥有的是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;
  4. 这确实将文本列转换为jsonb

    但是,如果我尝试查询:

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

    我收到错误。

    我看到转换仅在一个级别完成(即:sec->>'部分'工作正常)。

    查询SELECT pg_typeof(name->>'sections') from test;为我提供了列类型为文本。

    有没有办法可以将文本完全转换为jsonb,这样我才能成功查询SELECT sec->>'sections'->>'a' FROM test;

    我不想在下面的查询中将文本转换为json,因为我需要在' a'上创建索引。后面。

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

2 个答案:

答案 0 :(得分:6)

操作员->>提供文本作为结果。如果您需要->

,请使用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;

答案 1 :(得分:2)

或者更好的是,使用operator #>>

.meteor\local\build\programs\server\files

要在表达式索引中使用它,您需要额外的括号:

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

确保在查询中使用匹配的表达式(不带括号)以允许索引使用。