thử json_array_elements_text thay vì json_array_elements
và bạn không cần truyền rõ ràng sang văn bản (x::text
), vì vậy bạn có thể sử dụng:
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;
Đối với câu hỏi bổ sung của bạn
Tại sao x ::text không phải là một tập hợp?
Điều này được truyền và vì điều này, nó không gây ra bất kỳ lỗi nào, nhưng khi truyền chuỗi json thành văn bản như thế này:::text
, postgres thêm dấu ngoặc kép vào giá trị.
Chỉ cho mục đích thử nghiệm, hãy thay đổi lại chức năng của bạn về nguyên bản (như câu hỏi của bạn) và thử:
SELECT
(json_array_castext('["hello","world"]'))[1] = 'hello',
(json_array_castext('["hello","world"]'))[1],
'hello'
Như bạn thấy, (json_array_castext('["hello","world"]'))[1]
đưa ra "hello"
thay vì hello
. và đây là lý do tại sao bạn nhận được false
khi so sánh các giá trị đó.