我正在尝试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 |
只是想知道是否有更好的方法可以做到这一点?
答案 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
,然后对输入进行结果的左连接。