Filter json array

Hi,

ich komme einfach nicht weiter… meine Spalte “JsonAnswers” beinhaltet:

[
{“Infos zur RSV”:{“TextValue”:“Ja”,“ArrayStringDisplayValue”:[“Ja”]}},
{“Textfeld”:{“TextValue”:“Inbound”}},
{“Gespräch möglich”:{“TextValue”:“Gespräch möglich”}},
{“Absagegrund”:{“TextValue”:“28”,“ArrayStringDisplayValue”:["kein Interesse "]}},
{“Radio-buttons”:{“TextValue”:“Aufzeichnung gestartet?”,“ArrayStringDisplayValue”:[“Aufzeichnung gestartet?”]}},
{“kein Interesse”:{“TextValue”:“Kunde hat kein Interesse”}}
]

Ich hätte gern NUR den Wert “28” vom Element “Absagegrund”…

Mit:

Select json_array_elements("JsonAnswers")->'Absagegrund'->'TextValue'
from  (Select '[{"Infos zur RSV":{"TextValue":"Ja","ArrayStringDisplayValue":["Ja"]}},{"Textfeld":{"TextValue":"Inbound"}},{"Gespräch möglich":{"TextValue":"Gespräch möglich"}},{"Absagegrund":{"TextValue":"28","ArrayStringDisplayValue":["kein Interesse "]}},{"Radio-buttons":{"TextValue":"Aufzeichnung gestartet?","ArrayStringDisplayValue":["Aufzeichnung gestartet?"]}},{"kein Interesse":{"TextValue":"Kunde hat kein Interesse"}}]'::json as "JsonAnswers") x

bekomm ich zwar den Wert, aber dafür auch 5 leere Zeilen:

grafik

Danke Danke Danke!

Wenn Du die Funktion in den FROM Teil verlagerst (und jsonb verwendest) kannst Du mit einem WHERE prüfen ob es den Absagegrund gibt:

select x.element -> 'Absagegrund' ->> 'TextValue' as text_value
from  jsonb_array_elements('
    [ {"Infos zur RSV":{"TextValue":"Ja","ArrayStringDisplayValue":["Ja"]}},
      {"Textfeld":{"TextValue":"Inbound"}},
      {"Gespräch möglich":{"TextValue":"Gespräch möglich"}},
      {"Absagegrund":{"TextValue":"28","ArrayStringDisplayValue":["kein Interesse "]}},
      {"Radio-buttons":{"TextValue":"Aufzeichnung gestartet?","ArrayStringDisplayValue":["Aufzeichnung gestartet?"]}},
      {"kein Interesse":{"TextValue":"Kunde hat kein Interesse"}}]'::jsonb) as x(element)
where x.element ? 'Absagegrund'