从 Greenplum 中的 JSON 中删除 NULL 字段

Posted

技术标签:

【中文标题】从 Greenplum 中的 JSON 中删除 NULL 字段【英文标题】:Remove NULL fields from JSON in Greenplum 【发布时间】:2019-05-15 06:54:15 【问题描述】:

使用基于 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函数而不影响查询性能?

【问题讨论】:

【参考方案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 构造函数的结果首先被转换为文本,然后内部正则表达式替换任何 "name":null, 值,外部正则表达式从末尾修剪任何悬挂的逗号,最后整个事情是转换回 json。

【讨论】:

我认为只使用一个 regex_replace 就可以更简单,SELECT regexp_replace(row_to_json(e)::text, '((,*)"[^"]+:(null|"")(,*))*', '\4', 'g') FROM employees e;。这也将删除具有空值的键。正如我在下面回答的那样,我自己使用 plpython 函数解决了这个问题。【参考方案2】:

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

创建或替换函数 json_strip_null(json_with_nulls json) 返回文本 作为$$ 导入json def clean_empty(d): 如果不是 isinstance(d, (dict, list)): 返回 d 如果是实例(d,列表): 返回 [v for v in (clean_empty(v) for v in d) if v not in (None, '')] 返回 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) 返回 json.dumps(json_without_nulls, separators=(',', ':')) $$ 语言 plpythonu;

这个函数可以用作,

选择 json_strip_null(row_to_json(t)) 从表 t;

【讨论】:

【参考方案3】:

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

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

COALESCE 函数返回其第一个非空参数。只有当所有参数都为 null 时才返回 Null。它通常用于在检索数据进行显示时将默认值替换为空值,例如:

SELECT COALESCE(description, short_description, '(none)') ... 如果它不为 null,则返回 description,否则返回 short_description,如果它不为 null,否则返回 (none)。 ...

【讨论】:

以上是关于从 Greenplum 中的 JSON 中删除 NULL 字段的主要内容,如果未能解决你的问题,请参考以下文章

从 JSON 字符串中删除所有缩进和空格,除了它在 Ruby 中的值之外

如何识别Greenplum中的表是不是已更改?

从 JSON 中删除新行

在 GreenPlum 中插入

Greenplum(PostgreSql)函数实现批量删除表

我需要将 JSON 解析为 Greenplum