2016-07-18 14 views
3

Was ich habe, ist eine Textspalte in Postgresql, die ich in JSONB-Spalte konvertieren möchte.So konvertieren Sie Text für eine Postgresql-Spalte vollständig in Jsonb

Was ich habe versucht, ist dies:

  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;

Dies tat die Textspalte zu jsonb konvertieren.

Allerdings, wenn ich die Abfrage versuchen:

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

Ich erhalte eine Fehlermeldung.

Ich sehe die Umwandlung erfolgt nur auf einer Ebene (d. H .: sec - >> 'Abschnitte' funktioniert gut).

Die Abfrage SELECT pg_typeof(name->>'sections') from test; gibt mir Spaltentyp als Text.

Gibt es eine Möglichkeit, den Text vollständig in Jsonb konvertieren, so dass ich SELECT sec->>'sections'->>'a' FROM test; erfolgreich abfragen kann?

Ich möchte nicht den Text in JSON in der Abfrage wie unten konvertieren, wie ich Index für 'a' später erstellen muss.

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

Antwort

5

Der Betreiber ->> gibt einen Text als Ergebnis. Verwenden Sie -> wenn Sie jsonb wollen:

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

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

Verwendung:

select sec->'sections'->>'a' 
from test; 
2

Oder besser, noch, verwenden Sie die operator #>>:

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

Und dies zu verwenden, in einem Ausdruck Index, den Sie benötigen zusätzliche Klammern:

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

Stellen Sie sicher, dass in Abfragen ein passender Ausdruck (ohne Klammern) verwendet wird, um die Indexnutzung zuzulassen.