försök med json_array_elements_text istället för json_array_elements
, och du behöver inte explicit casting till text (x::text
), så att du kan använda:
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;
För din ytterligare fråga
Varför är x::text inte en rollbesättning?
Detta är cast och på grund av detta ger det inget fel, men när man castar json-sträng till text så här:::text
, postgres lägger till citat till värde.
Bara för teständamål, låt oss ändra din funktion till original igen (som det står i din fråga) och försök:
SELECT
(json_array_castext('["hello","world"]'))[1] = 'hello',
(json_array_castext('["hello","world"]'))[1],
'hello'
Som du ser, (json_array_castext('["hello","world"]'))[1]
ger "hello"
istället för hello
. och det var därför du fick false
när man jämför dessa värden.