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.