json - 从 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 函数而不影响查询性能?
解决方案
我在 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。
推荐阅读
- python - 将视频帧从 ffmpeg 管道传输到 numpy 数组,而无需将整个电影加载到内存中
- javascript - 部署到heroku时,texpress-session未在反应应用程序中设置cookie
- python - 如何将对象数组的字符串表示形式转换为对象数组?
- seurat - 将 colnames 添加到我的数据框中(Seurat,cellhasing)
- python - 获取当 mtime 早于 ctime 时创建的实际日期(又名让 Windows 和 Linux 玩得好:第 1,432 部分)
- c# - iText 7按自定义名称重新标记c#
- linux - FS 和 GS 寄存器在线性地址空间中映射到哪里?
- python - 从列表生成列表列表
- java - 使用 JpaRepository 更新时事务提交错误
- html - 在 python 上自动从站点恢复链接