2017-03-10 4 views
1

ich diese json Struktur haben, wo ich speichern auch eine PostgreSQL-TypnameCast Typ A Typ Name gegeben

{ 
    "temperature":{ 
     "value":"(-75,-70]", 
     "type":"int4range" 
    } 
} 

i den Wert bekommen kann wie

SELECT '{"temperature":{"value":"(-75,-70]","type":"int4range"}}'::jsonb #> ARRAY['temperature','value'] 

jetzt der Wert Typ Text und Ich weiß, dass ich nur einfache Typen in JSON speichern kann, aber wie kann ich den Wert zu int4range dynamisch unter Verwendung des Typennamens, den ich habe, umwandeln?

+1

Ich denke, dass dynamische Posts in Postgres unmöglich sind. Sie können dies natürlich innerhalb einer plpgsql-Funktion tun, aber Sie können das Ergebnis nicht korrekt zurückgeben. – klin

+0

@klin danke, das war hilfreich wollte nur sicher sein, dass es nicht gerade vorwärts geht – Bread

Antwort

1

Wie @Bread sagte, können Sie Daten nicht dynamisch übertragen.

aber Sie so etwas wie tun könnte:

WITH jsonb as (
    SELECT '{"temperature":{"value":"[-75,-70]","type":"int4range"}}'::json 
), fromjsonb as (
    SELECT json->'temperature'->'value' as element, 
      json->'temperature'->'type' as type 
    FROM jsonb 
), trim as (
    SELECT trim(both '"' from element::text) as element, 
      trim(both '"' from type::text) as type 
    FROM fromjsonb 
) 
SELECT CASE WHEN type = 'int4range' THEN element::int4range 
      -- ELSE element::text 
      END 
FROM trim; 

    case  
----------- 
[-75,-69) 
(1 row) 

In meinem Beispiel er die Daten auswählt, und das kann nicht funktionieren, da PostgreSQL finden Sie eine erste Zeile als int4range dann nicht zulassen, wählen Sie das folgende als eine andere Art .

Aber Sie können die gleiche Logik verwenden, um Daten in eine andere Tabelle (die ich vermute, ist Ihr Ziel) einfügen und das wird funktionieren.