tente json_array_elements_text em vez de
json_array_elements
, e você não precisa de conversão explícita para texto (x::text
), então você pode 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 sua pergunta adicional
Por que x::text não é um elenco?
Isso é convertido e, por causa disso, não está dando nenhum erro, mas ao converter a string json para texto como este:
::text
, o postgres adiciona aspas ao valor. Apenas para fins de teste, vamos alterar sua função para original novamente (como está na sua pergunta) e tente:
SELECT
(json_array_castext('["hello","world"]'))[1] = 'hello',
(json_array_castext('["hello","world"]'))[1],
'hello'
Como você vê,
(json_array_castext('["hello","world"]'))[1]
dá "hello"
em vez de hello
. e foi por isso que você obteve false
ao comparar esses valores.