versuchen Sie json_array_elements_text anstelle von json_array_elements
, und Sie brauchen keine explizite Umwandlung in Text (x::text
), sodass Sie Folgendes verwenden können:
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;
Für Ihre zusätzliche Frage
Warum ist x::text kein Cast?
Dies wird umgewandelt und aus diesem Grund gibt es keinen Fehler, aber wenn Json-String in Text wie folgt umgewandelt wird:::text
, postgres fügt dem Wert Anführungszeichen hinzu.
Nur zu Testzwecken können Sie Ihre Funktion wieder auf Original ändern (wie in Ihrer Frage) und versuchen:
SELECT
(json_array_castext('["hello","world"]'))[1] = 'hello',
(json_array_castext('["hello","world"]'))[1],
'hello'
Wie Sie sehen, (json_array_castext('["hello","world"]'))[1]
gibt "hello"
statt hello
. und deshalb haben Sie false
erhalten beim Vergleich dieser Werte.