从 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 中的值之外