首页 > 解决方案 > 从 Greenplum 中的 JSON 中删除 NULL 字段

问题描述

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

标签: jsongreenplum

解决方案


我在 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。


推荐阅读