2016-07-18 21 views
3

PostgresqlでJSONB列に変換するテキスト列があります。これは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;

私は何をしようとしたことはこれです。

私は照会しようとする場合は、:

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

私はエラーを取得します。

変換は1つのレベルでのみ行われます(例:sec - >> 'sections'はうまく動作します)。

クエリSELECT pg_typeof(name->>'sections') from test;は私にテキストをテキストとして与えます。

私はSELECT sec->>'sections'->>'a' FROM test;を正常に照会できるように、テキストをjsonbに完全に変換できる方法はありますか?

「a」の後にインデックスを作成する必要があるため、以下のようなクエリでテキストをjsonに変換したくないです。

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}')); 

索引の使用を許可するために、照会に一致する式(かっこなし)を使用するようにしてください。

関連する問題