是否可以从postrgesql中的jsonb对象“投射”特定字段?

时间:2016-02-28 12:36:57

标签: json postgresql

我正在寻找与postgres json处理函数中的mongodb相当的'$ project'

我有一个大的json对象,我想从中选择一些字段。 特定的字段名称是动态的,所以我正在寻找一个不包括硬编码的解决方案

例如,给定对象如:

{
'a':...
'b':...
'c':...
'd':...
}

这样的陈述
select json_project(data, ['a','b'])
from table

应该返回

{
'a':...
'b':...
}

其中字段列表应为参数

2 个答案:

答案 0 :(得分:1)

这应该做(未经测试):

CREATE FUNCTION json_project(doc json, keys json) RETURN json AS $$
  SELECT json_agg(json_build_object(d.key, d.value))
  FROM json_each(doc) d
  JOIN json_array_elements(keys) k ON k.value = d.key;
$$ LANGUAGE SQL;

诀窍是将json doc分解为其键(文本)和值(标量或更复杂的json文档),然后将JOIN分解为爆炸参数数组中包含的键,最后将匹配聚合成一个新的json文档。

请注意,如果您使用jsonb类型,则应使用jsonb_*变体调用所有函数。

答案 1 :(得分:0)

这是我的尝试:

let dp = UIBezierPath.init(rect: myRect)
dp.stroke()

如果你将它作为:

运行
CREATE or replace FUNCTION json_project(jsondata jsonb, jsonfields varchar) RETURNS json 
AS $$
declare
  newJson varchar;
  cs record;
BEGIN
    newJson := '{';
    for cs in (select key, value 
         from json_each(jsondata::json)
        where key in (select * from unnest(string_to_array(jsonfields,','))) ) loop
    if newJson != '{' then
        newJson := newJson || ',';
    end if;
    newJson := newJson || '"'||cs.key||'"'||':'||cs.value;
    end loop;
    newJson := newJson || '}';

    RETURN newJson::jsonb;
END;
$$ LANGUAGE plpgsql;

你会得到

select json_project( '{"a":"someAvalue", "b":"someBvalue", "c":1, "d":"someDvalue" }', 
                     'a,c' );