私は自分でこの問題に遭遇しました、そしてこれが私がそれにアプローチした方法です。配列を反復処理し、添え字を使用して->>演算子を使用してテキスト値を取得するヘルパー関数を作成しました。誰かがもっと良い方法を知っているなら、これは少し扱いにくいように見えるので、私はそれについて聞いてうれしいです。
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;
次に、次のようなことができます。
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)
配列を直接処理したくない場合は、関数に一連のテキストを返すようにすることもできます。
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;
そして、これを行います:
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)