zkuste json_array_elements_text místo json_array_elements
a nepotřebujete explicitní přetypování na text (x::text
), takže můžete použít:
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;
Pro vaši doplňující otázku
Proč x::text není obsazení?
Toto je přetypováno a kvůli tomu nedává žádnou chybu, ale při přetypování řetězce json na text, jako je tento:::text
, postgres přidává k hodnotě uvozovky.
Jen pro testovací účely změňme vaši funkci znovu na původní (jak je to ve vaší otázce) a zkuste:
SELECT
(json_array_castext('["hello","world"]'))[1] = 'hello',
(json_array_castext('["hello","world"]'))[1],
'hello'
Jak vidíte, (json_array_castext('["hello","world"]'))[1]
dává "hello"
místo hello
. a to byl důvod, proč jste dostali false
při porovnávání těchto hodnot.