prøv json_array_elements_text i stedet for json_array_elements
, og du behøver ikke eksplicit casting til tekst (x::text
), så du kan bruge:
CREATE or replace FUNCTION json_array_castext(json) RETURNS text[] AS $f$
SELECT array_agg(x) FROM json_array_elements_text($1) t(x);
$f$ LANGUAGE sql IMMUTABLE;
Til dit yderligere spørgsmål
Hvorfor er x::text ikke en rollebesætning?
Dette er castet og på grund af dette giver det ikke nogen fejl, men når du caster json-strengen til tekst som denne:::text
, postgres tilføjer citater til værdi.
Bare for testformål, lad os ændre din funktion til original igen (som det er i dit spørgsmål) og prøv:
SELECT
(json_array_castext('["hello","world"]'))[1] = 'hello',
(json_array_castext('["hello","world"]'))[1],
'hello'
Som du kan se, (json_array_castext('["hello","world"]'))[1]
giver "hello"
i stedet for hello
. og det var derfor, du fik false
når man sammenligner disse værdier.