Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
postgresql json_对象_键(var1)消除var1为空的记录_Json_Postgresql - Fatal编程技术网

postgresql json_对象_键(var1)消除var1为空的记录

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

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

我在使用json_object_键(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
列表中的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)