postgresql json_对象_键(var1)消除var1为空的记录
我正在尝试postgresql 9.3.4中的一些JSON功能 我在使用json_object_键(var1)时遇到了一个问题,它会删除var1为null的行 我如何调整查询以保留这些记录,在这种情况下填充null 例如,我有一个表test1:postgresql json_对象_键(var1)消除var1为空的记录,json,postgresql,Json,Postgresql,我正在尝试postgresql 9.3.4中的一些JSON功能 我在使用json_object_键(var1)时遇到了一个问题,它会删除var1为null的行 我如何调整查询以保留这些记录,在这种情况下填充null 例如,我有一个表test1: postgres=# select * from test1; var1 | var2 ------+------------------- 1 | {"a": 20, "b":30} 2 | postg
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
列表中的set returning函数的古怪支持
我最初编写了错误的查询:
但这是错误的,因为隐式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
它为每个json字段计算
json\u object\u keys
,然后将结果与输入进行左连接。Hi Craig,它仍然消除了key所在的记录null@mandeep_m91你说得很对。我没有测试,因为没有方便的样本数据。我已经构建了一些,并进行了测试,然后生成了一个正确的查询。(CREATETABLE和insert语句或a等示例数据在问题中非常有用)。
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)