probeer json_array_elements_text in plaats van json_array_elements
, en je hoeft niet expliciet naar tekst te casten (x::text
), zodat u kunt gebruiken:
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;
Voor uw aanvullende vraag
Waarom is x::text geen cast?
Dit is cast en daarom geeft het geen foutmelding, maar bij het casten van json string naar tekst als volgt:::text
, postgres voegt aanhalingstekens toe aan waarde.
Laten we, alleen voor testdoeleinden, uw functie weer in origineel veranderen (zoals in uw vraag) en proberen:
SELECT
(json_array_castext('["hello","world"]'))[1] = 'hello',
(json_array_castext('["hello","world"]'))[1],
'hello'
Zoals je ziet, (json_array_castext('["hello","world"]'))[1]
geeft "hello"
in plaats van hello
. en daarom kreeg je false
bij het vergelijken van die waarden.