我正在尝试 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 |
只是想知道是否有更好的方法?
最佳答案
不要使用 PostgreSQL 对 SELECT
列表中的集合返回函数的相当古怪的支持,而是使用横向查询。
我最初编写了不正确查询:
select t.var1, k from test1 t, json_object_keys(t.var2) k;
但这是错误的,因为隐式横向
是交叉联接,而零行的交叉联接仍然是零行。
你想要:
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);
例如
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
,然后根据输入对结果进行左连接。
关于json - postgresql json_object_keys(var1) 消除 var1 为 null 的记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24867791/