essayez json_array_elements_text au lieu de json_array_elements
, et vous n'avez pas besoin d'un transtypage explicite en texte (x::text
), vous pouvez donc utiliser :
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;
Pour votre question complémentaire
Pourquoi x::text n'est pas un cast ?
Ceci est casté et à cause de cela, il ne donne aucune erreur, mais lors de la conversion de la chaîne json en texte comme ceci :::text
, postgres ajoute des guillemets à value.
Juste à des fins de test, redéfinissons votre fonction sur l'original (comme dans votre question) et essayez :
SELECT
(json_array_castext('["hello","world"]'))[1] = 'hello',
(json_array_castext('["hello","world"]'))[1],
'hello'
Comme vous le voyez, (json_array_castext('["hello","world"]'))[1]
donne "hello"
au lieu de hello
. et c'est pourquoi vous avez obtenu false
lors de la comparaison de ces valeurs.