spróbuj json_array_elements_text zamiast json_array_elements
i nie potrzebujesz jawnego rzutowania na tekst (x::text
), więc możesz użyć:
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;
Na Twoje dodatkowe pytanie
Dlaczego x::text nie jest rzutowaniem?
To jest rzutowane i z tego powodu nie daje żadnego błędu, ale podczas rzutowania łańcucha json na tekst w ten sposób:::text
, postgres dodaje cytaty do wartości.
Tylko w celach testowych, zmieńmy ponownie twoją funkcję na oryginalną (tak jak w twoim pytaniu) i spróbuj:
SELECT
(json_array_castext('["hello","world"]'))[1] = 'hello',
(json_array_castext('["hello","world"]'))[1],
'hello'
Jak widzisz, (json_array_castext('["hello","world"]'))[1]
daje "hello"
zamiast hello
. i dlatego otrzymałeś false
podczas porównywania tych wartości.