使用基于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函数而又不影响查询性能?
答案 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;否则为(无)。 ...