postgresql json_object_keys(var1)删除var1为null的记录

时间:2014-07-21 14:35:46

标签: json postgresql

我正在尝试postgresql 9.3.4中的一些JSON功能。

我在使用json_object_keys(var1)时遇到问题,它会删除var1为null的行。

如何调整查询以保留这些记录,在这种情况下填充null

例如,我有一个表test1:

postgres=# select * from test1;
 var1 |       var2        
------+-------------------
    1 | {"a": 20, "b":30}
    2 | 

postgres=# select var1,json_object_keys(var2) from test1;
 var1 | json_object_keys 
------+------------------
    1 | a
    1 | b

我希望输出是这样的:

postgres=# select var1, json_object_keys(coalesce(var2,'{"": null}')) from test1;
 var1 | json_object_keys 
------+------------------
    1 | a
    1 | b
    2 | 

只是想知道是否有更好的方法可以做到这一点?

1 个答案:

答案 0 :(得分:3)

不使用PostgreSQL对SELECT列表中的集合返回函数的相当古怪的支持,而是使用横向查询。

我最初写了不正确的查询:

select t.var1, k from test1 t, json_object_keys(t.var2) k;

但这是错误的,因为隐式lateral是交叉连接,而零行的交叉连接仍然是零行。

你想:

SELECT t.var1, k
FROM test1 t 
LEFT JOIN LATERAL (
  SELECT t.var1, k 
  FROM json_object_keys(t.var2) k
) lj(var1, k) 
ON (t.var1 = lj.var1);

e.g。

regress=> CREATE TABLE test1 ( var1 integer, var2 json );
CREATE TABLE
regress=> INSERT INTO test1 (var1, var2) VALUES (1, '{"a": 20, "b":30}'), (2, NULL);
INSERT 0 2
regress=>   SELECT t.var1, k
regress->     FROM test1 t 
regress->     LEFT JOIN LATERAL (
regress(>       SELECT t.var1, k 
regress(>       FROM json_object_keys(t.var2) k
regress(>     ) lj(var1, k) 
regress->     ON (t.var1 = lj.var1);
 var1 | k 
------+---
    1 | a
    1 | b
    2 | 
(3 rows)

为每个json字段计算json_object_keys,然后对输入进行结果的左连接。