2016-07-20 24 views
2

Ich greife auf ein Array (ein json-Objekt mit dem Namen 'choice_values') in einem Feld jsonb zu und möchte seinen Inhalt in ein durch Komma getrenntes Textfeld analysieren.Ergebnis von jsonb_array_elements als durch Komma getrennte Liste zurückgeben

SELECT 
    jsonb_array_elements(doc -> 'form_values' -> '8189' -> 'choice_values') 
FROM 
    field_data.exports; 

Den jsonb_array_elements Funktion einen „SETOF Text“ zurückgibt, die ich in eine kommagetrennte Liste der Array-Werte umgewandelt dürfte, in einem einzigen Feld enthält.

Vielen Dank.

Antwort

2

Eingestellte Rückgabefunktionen (wie jsonb_array_elements_text()) können in der SELECT-Liste aufgerufen werden, sie können dann jedoch nicht in Aggregatfunktionen verwendet werden.

Dies ist eine gute Praxis in FROM-Klausel festgelegt Rückkehr Funktionen aufzurufen, oft in einer wie in diesem Beispiel seitlich verbinden:

with the_data as (
    select '["alfa", "beta", "gamma"]'::jsonb as js 
    ) 

select string_agg(elem, ',') 
from 
    the_data, 
    jsonb_array_elements_text(js) elem; 

    string_agg  
----------------- 
alfa,beta,gamma 
(1 row)  

So sollte Ihre Abfrage wie folgt aussehen:

select string_agg(elem, ',') 
from 
    field_data.exports, 
    jsonb_array_elements_text(doc -> 'form_values' -> '8189' -> 'choice_values') elem; 
1

Die Verwendung der string_agg aggregate function mit einer Unterauswahl von jsonb_array_elements_text scheint zu funktionieren (getestet auf PG 9.5). Beachten Sie die Verwendung von jsonb_array_elements_text, hinzugefügt in PostgreSQL 9.4 statt jsonb_array_elements, von PostgreSQL 9.3.

with exports as (
    select $${"form_values": {"8189": {"choice_values": ["a","b","c"]}}}$$::jsonb as doc 
) 
SELECT 
    string_agg(values, ', ') 
FROM 
    exports, jsonb_array_elements_text(doc -> 'form_values' -> '8189' -> 'choice_values') values 
GROUP BY 
    exports.doc; 

Ausgang:

'a, b, c'

Siehe auch this question and its answers.

+1

Ja und ich hätte das in der Frage notieren müssen, sorry. Aus irgendeinem Grund sieht die Funktion string_agg das Ergebnis von jsonb_array_elements() als Typ "jsonb" und nicht als "setof text". Hier ist der Fehler: "ErrorMessage: Funktion String_agg (Jsonb, Text) existiert nicht" – Joebocop

+0

Ich habe auch etwas in Ihrer Frage übersehen. Sie müssen 'jsonb_array_elements_text' ([hinzugefügt in PG 9.4] (https://www.postgresql.org/docs/9.4/static/functions-json.html)) verwenden, um 'setof text' anstelle von' jsonb' zu erhalten die Ausgabe. –

+0

Siehe die andere Frage, die ich verlinkt habe, wenn Sie PG 9.3 aus irgendeinem Grund verwenden müssen; Es gibt einige Problemumgehungen. –