coba json_array_elements_text alih-alih json_array_elements , dan Anda tidak perlu casting eksplisit ke teks (x::text ), sehingga Anda dapat menggunakan:
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;
Untuk pertanyaan tambahan Anda
Mengapa x::text bukan pemeran?
Ini dilemparkan dan karena ini, itu tidak memberikan kesalahan apa pun, tetapi ketika mentransmisikan string json ke teks seperti ini:::text , postgres menambahkan tanda kutip ke nilai.
Hanya untuk tujuan pengujian, mari ubah fungsi Anda ke yang asli lagi (seperti dalam pertanyaan Anda) dan coba:
SELECT
(json_array_castext('["hello","world"]'))[1] = 'hello',
(json_array_castext('["hello","world"]'))[1],
'hello'
Seperti yang Anda lihat, (json_array_castext('["hello","world"]'))[1] memberikan "hello" bukannya hello . dan inilah mengapa Anda mendapatkan false saat membandingkan nilai tersebut.