我正在尝试在PostgreSQL 9.3中使用新的JSON功能,而我正在寻找一种能够使用JSON的功能,即to_json(anyelement)的对话。
以下是JSON示例:
{"single_comment": "Fred said \"Hi.\"" ,
"comments_array": ["Fred said \"Hi.\"", "Fred said \"Hi.\"", "Fred said \"Hi.\""]}
查询:
SELECT json_array_elements(json_column->'comments_array')
按照文档中的描述返回SET OF JSON。
"Fred said \"Hi.\""
"Fred said \"Hi.\""
"Fred said \"Hi.\""
有没有办法取消结果,所以我可以得到以下结果:
Fred said "Hi."
Fred said "Hi."
Fred said "Hi."
在文档中,我没有看到任何可以帮助我的功能。不幸的是,对我来说,不能选择PLV8。
任何想法都受到高度赞赏。
答案 0 :(得分:2)
select t.comments->>0 from
(select jsonb_array_elements(your_table.json_column->'comments_array') as comments
from your_table) as t;
答案 1 :(得分:1)
我自己也遇到了这个问题,这就是我接触它的方式。我创建了一个辅助函数,它迭代数组并使用 - >>运算符使用下标来获取文本值。如果有人知道更好的方式,我很高兴听到它,因为这看起来有点笨拙。
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)
答案 2 :(得分:0)
我设法通过几乎没有修改JSON来实现结果:
{"comments_array": [{"comment": "Fred said \"Hi.\""}, {"comment": "Fred said \"Hello.\""}]}
现在我们不使用字符串数组,而是使用对象数组,以下查询按照我的意愿工作:
SELECT (json_array_elements(json_column->'comments_array'))->>'comment'
现在这将满足我的需求,但如果有人知道我们如何通过字符串数组实现输出,请分享它:)