prova json_array_elements_text invece di json_array_elements
e non è necessario il cast esplicito al testo (x::text
), quindi puoi usare:
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;
Per la tua domanda aggiuntiva
Perché x::text non è un cast?
Questo è cast e, per questo motivo, non dà alcun errore, ma quando si esegue il cast di una stringa json su un testo in questo modo:::text
, postgres aggiunge virgolette al valore.
Solo a scopo di test, cambia di nuovo la tua funzione in originale (come è nella tua domanda) e prova:
SELECT
(json_array_castext('["hello","world"]'))[1] = 'hello',
(json_array_castext('["hello","world"]'))[1],
'hello'
Come vedi, (json_array_castext('["hello","world"]'))[1]
dà "hello"
invece di hello
. ed è per questo che hai ricevuto false
quando si confrontano questi valori.