Tôi vừa mới gặp vấn đề này, và đây là cách tôi tiếp cận vấn đề này. Tôi đã tạo một hàm trợ giúp lặp qua mảng và sử dụng toán tử ->> bằng cách sử dụng chỉ số con để lấy lại giá trị văn bản. Nếu có ai biết cách hay hơn, tôi rất vui khi biết về nó, vì điều này có vẻ hơi klunky.
CREATE OR REPLACE FUNCTION json_text_array_to_pg_text_array(data json) returns text[] AS $$
DECLARE
i integer;
agg text[];
BEGIN
FOR i IN 0..json_array_length(data)-1 LOOP
agg := array_append(agg, data->>i);
END LOOP;
return agg;
END
$$ language plpgsql;
Sau đó, bạn có thể làm những việc như:
test=# select json_text_array_to_pg_text_array('[ "hello","the\"re","i''m", "an", "array" ]'::json);
json_text_array_to_pg_text_array
----------------------------------
{hello,"the\"re",i'm,an,array}
(1 row)
Bạn cũng có thể làm cho hàm chỉ trả về một tập hợp văn bản nếu bạn không muốn xử lý trực tiếp các mảng:
CREATE OR REPLACE FUNCTION json_text_array_to_row(data json) returns setof text AS $$
DECLARE
i integer;
BEGIN
FOR i IN 0..json_array_length(data)-1 LOOP
return next data->>i;
END LOOP;
return;
END
$$ language plpgsql;
Và sau đó làm điều này:
test=# select json_text_array_to_row('{"single_comment": "Fred said \"Hi.\"" ,"comments_array": ["Fred said \"Hi.\"", "Fred said \"Hi.\"", "Fred said \"Hi.\""]}'::json->'comments_array');
json_text_array_to_row
------------------------
Fred said "Hi."
Fred said "Hi."
Fred said "Hi."
(3 rows)