prueba json_array_elements_text en lugar de json_array_elements
, y no necesita conversión explícita a texto (x::text
), por lo que puede usar:
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;
Para su pregunta adicional
¿Por qué x::text no es un molde?
Esto se emite y, debido a esto, no da ningún error, pero cuando se convierte una cadena json en un texto como este:::text
, postgres agrega comillas al valor.
Solo con fines de prueba, cambiemos su función a original nuevamente (como está en su pregunta) e intentemos:
SELECT
(json_array_castext('["hello","world"]'))[1] = 'hello',
(json_array_castext('["hello","world"]'))[1],
'hello'
Como ves, (json_array_castext('["hello","world"]'))[1]
da "hello"
en lugar de hello
. y por eso obtuviste false
al comparar esos valores.