从Greenplum中的JSON中删除NULL字段

时间:2019-05-15 06:54:16

标签: json greenplum

使用基于Postgres 8.4的Greenplum 5. *数据库。

我正在使用row_to_json和array_to_json函数创建JSON输出;但这最终会导致JSON中的键具有空值。 Postgres最新版本具有json_strip_null函数,用于删除具有空值的键。

我需要将生成的JSON文件导入MongoDB;但是mongoimport也没有选择忽略JSON中的空键。

我尝试过使用null创建JSON文件,然后使用sed从JSON文件中删除null字段的一种方法。

sed -i 's/\(\(,*\)"[a-z_]*[0-9]*":null\(,*\)\)*/\3/g' output.json

但是正在寻找一种方法来完成数据库本身,因为它将更快。有什么建议如何在Greenplum中呈现json_strip_null函数而又不影响查询性能?

3 个答案:

答案 0 :(得分:1)

在pg8.3上的GP 5.17中,我遇到了同样的问题-并且使用此正则表达式成功删除了空值密钥对。我在初始插入到json列中使用了它,但是您可以修改:

select
    col5,
    col6,
    regexp_replace(regexp_replace(
    (SELECT row_to_json(j) FROM
        (SELECT 
        col1,col2,col3,col4
        ) AS j)::text,
    '(?!{|,)("[^"]+":null[,]*)','','g'),'(,})$','}')::json
        AS nvp_json
from foo

由内而外地进行操作,首先将row_to_json构造函数的结果转换为文本,然后内部的regexp替换任何"name":null,值,外部的regexp从末尾修剪所有悬挂的逗号,最后是整个东西被投射回json。

答案 1 :(得分:1)

我使用plpython函数解决了此问题。此泛型函数可用于从任何JSON中删除空值键和空值键。


    CREATE OR REPLACE FUNCTION json_strip_null(json_with_nulls json)
              RETURNS text
              AS $$
    import json

    def clean_empty(d):
        if not isinstance(d, (dict, list)):
            return d
        if isinstance(d, list):
            return [v for v in (clean_empty(v) for v in d) if v not in (None, '')]
        return {k: v for k, v in ((k, clean_empty(v)) for k, v in d.items()) if v not in (None, '')}

    json_to_dict = json.loads(json_with_nulls)
    json_without_nulls = clean_empty(json_to_dict)
    return json.dumps(json_without_nulls, separators=(',', ':'))
    $$ LANGUAGE plpythonu;

此功能可以用作


    SELECT json_strip_null(row_to_json(t))
    FROM table t;

答案 2 :(得分:0)

您可以使用COALESCE将空值替换为空字符串或其他值。

https://www.postgresql.org/docs/8.3/functions-conditional.html

COALESCE函数返回其第一个不为null的参数。仅当所有参数均为null时,才返回Null。在检索数据进行显示时,通常用它来用默认值代替空值,例如:

SELECT COALESCE(描述,简短描述,'(无)')... 如果不为null,则返回描述;否则为short_description;否则为(无)。 ...