опитайте json_array_elements_text вместо json_array_elements
, и нямате нужда от изрично прехвърляне към текст (x::text
), така че можете да използвате:
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;
За вашия допълнителен въпрос
Защо x::text не е прехвърляне?
Това се предава и поради това не дава никаква грешка, но когато се предава json низ към текст като този:::text
, postgres добавя кавички към стойността.
Само за тестови цели, нека променим функцията си отново на оригинална (както е във вашия въпрос) и опитайте:
SELECT
(json_array_castext('["hello","world"]'))[1] = 'hello',
(json_array_castext('["hello","world"]'))[1],
'hello'
Както виждате, (json_array_castext('["hello","world"]'))[1]
дава "hello"
вместо hello
. и затова получихте false
когато сравнявате тези стойности.