Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.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数组时是否应该使用横向?_Sql_Arrays_Json_Postgresql_Join - Fatal编程技术网

在postgresql上查询JSON数组时是否应该使用横向?

在postgresql上查询JSON数组时是否应该使用横向?,sql,arrays,json,postgresql,join,Sql,Arrays,Json,Postgresql,Join,我有一个与预期一样有效的查询: SELECT jsonb_array_elements(meta.genres)->>'name' "name", COUNT(id) FROM movies_metadata meta GROUP BY "name"; 但在这种类型的查询中,似乎每个人都使用了侧向。如果我使用横向连接,我可以这样做: SELECT y.x->>'name' "name", COUNT(id) FROM movies_metadata meta LATER

我有一个与预期一样有效的查询:

SELECT jsonb_array_elements(meta.genres)->>'name' "name", COUNT(id)
FROM movies_metadata meta
GROUP BY "name";
但在这种类型的查询中,似乎每个人都使用了侧向。如果我使用横向连接,我可以这样做:

SELECT y.x->>'name' "name", COUNT(id)
FROM movies_metadata meta
LATERAL (SELECT jsonb_array_elements(meta.genres) x) y
GROUP BY y.x;

两个查询产生相同的结果,所以使用第二个查询有什么意义吗?

对于这个用例,两个查询是等效的。第二种形式使用横向连接,比第一种形式灵活得多。假设您想从嵌套元素中读取更多的键:第一个表单不能这样做,您需要使用第二个表单

select
    m.id,
    y.x ->> 'name' as name,
    y.x ->> 'key2' as key2,
    y.x ->> 'key3' as key3
from movies_metadata m
cross join lateral jsonb_array_elements(m.genres) as y(x)

注意,您不需要嵌套的select:如上所示,jsonb_array_元素是一个集合返回函数,可以直接放在from子句中。

对于这个用例,两个查询是等效的。第二种形式使用横向连接,比第一种形式灵活得多。假设您想从嵌套元素中读取更多的键:第一个表单不能这样做,您需要使用第二个表单

select
    m.id,
    y.x ->> 'name' as name,
    y.x ->> 'key2' as key2,
    y.x ->> 'key3' as key3
from movies_metadata m
cross join lateral jsonb_array_elements(m.genres) as y(x)

请注意,您不需要嵌套的select:如上所示,jsonb_数组_元素是一个集合返回函数,可以直接放在from子句中。

这是一个首选项

许多Postgres用户在select子句中使用set返回函数没有问题。显然,这是可以接受的语法。这些都是SQL扩展,因此没有标准指定的正确方法

也就是说,我非常喜欢将集合返回函数放在from子句中,并使用横向连接。我想让from子句回答这个问题:进入这个查询的行的空间是多少?。我希望select子句回答:返回哪些列和表达式

此外,其他数据库往往要求set返回函数位于from子句中


因此,我发现横向连接更符合SQL的精神。但这两种方法都是正确的。

这是一个偏好问题

许多Postgres用户在select子句中使用set返回函数没有问题。显然,这是可以接受的语法。这些都是SQL扩展,因此没有标准指定的正确方法

也就是说,我非常喜欢将集合返回函数放在from子句中,并使用横向连接。我想让from子句回答这个问题:进入这个查询的行的空间是多少?。我希望select子句回答:返回哪些列和表达式

此外,其他数据库往往要求set返回函数位于from子句中

因此,我发现横向连接更符合SQL的精神。但这两种方法都是正确的