Postgres 得到 json 计数
Postgres get json count over
我有一列包含 json 对象。我的目标是获取数组的总数,即使我正在使用限制。
CREATE TABLE json_values (
elems json
);
INSERT INTO json_values VALUES ('{"field1" : [{"val" : 1}, {"val" : 2}, { "val" : 3}] ,"field2" : []}');
SELECT json_array_elements(elems->'field1'), count(*) OVER()
FROM json_values
LIMIT 1
这显示了第一行,但似乎没有考虑计数 over(),实际上我只得到 1 而不是 3。
还有其他方法吗?
您需要使用适当的横向连接才能完成这项工作:
SELECT e.*, count(*) OVER()
FROM json_values
cross join lateral json_array_elements(elems->'field1') as e(val)
LIMIT 1;
这是 select
列表中不应调用集合返回函数的原因之一。
另一个可能更快的选项是使用 Postgres 9.3 中引入的 json_array_length()
SELECT e.*, json_array_length(elems->'field1')
FROM json_values
cross join lateral json_array_elements(elems->'field1') as e (val)
LIMIT 1;
根据您具体想要做什么,在进行交叉连接之前限制可能的数组元素可能会更有效:
select e.*, json_array_length(elems->'field1')
from json_values
cross join lateral (
select *
from json_array_elements(elems->'field1')
limit 1
) as e (val)
但是如果你只想获取每个文档的数组的第一个元素,下面的方法会快得多:
SELECT (elems->'field1') -> 0, json_array_length(elems->'field1')
FROM json_values;
将 json_array_elements()
放在 FROM
子句中:
select count(*) over()
from json_values,
lateral json_array_elements(elems->'field1')
limit 1;
count
-------
3
(1 row)
return json 数组的长度有一个函数:
https://www.postgresql.org/docs/9.3/static/functions-json.html
SELECT
json_array_elements(elems->'field1') field1
, json_array_length(elems->'field1') field_1_length
FROM json_values
LIMIT 1
我不明白为什么在这种情况下需要交叉连接或 window 函数,尽管使用它们可以获得相同的结果。
我有一列包含 json 对象。我的目标是获取数组的总数,即使我正在使用限制。
CREATE TABLE json_values (
elems json
);
INSERT INTO json_values VALUES ('{"field1" : [{"val" : 1}, {"val" : 2}, { "val" : 3}] ,"field2" : []}');
SELECT json_array_elements(elems->'field1'), count(*) OVER()
FROM json_values
LIMIT 1
这显示了第一行,但似乎没有考虑计数 over(),实际上我只得到 1 而不是 3。
还有其他方法吗?
您需要使用适当的横向连接才能完成这项工作:
SELECT e.*, count(*) OVER()
FROM json_values
cross join lateral json_array_elements(elems->'field1') as e(val)
LIMIT 1;
这是 select
列表中不应调用集合返回函数的原因之一。
另一个可能更快的选项是使用 Postgres 9.3 中引入的 json_array_length()
SELECT e.*, json_array_length(elems->'field1')
FROM json_values
cross join lateral json_array_elements(elems->'field1') as e (val)
LIMIT 1;
根据您具体想要做什么,在进行交叉连接之前限制可能的数组元素可能会更有效:
select e.*, json_array_length(elems->'field1')
from json_values
cross join lateral (
select *
from json_array_elements(elems->'field1')
limit 1
) as e (val)
但是如果你只想获取每个文档的数组的第一个元素,下面的方法会快得多:
SELECT (elems->'field1') -> 0, json_array_length(elems->'field1')
FROM json_values;
将 json_array_elements()
放在 FROM
子句中:
select count(*) over()
from json_values,
lateral json_array_elements(elems->'field1')
limit 1;
count
-------
3
(1 row)
return json 数组的长度有一个函数:
https://www.postgresql.org/docs/9.3/static/functions-json.html
SELECT
json_array_elements(elems->'field1') field1
, json_array_length(elems->'field1') field_1_length
FROM json_values
LIMIT 1
我不明白为什么在这种情况下需要交叉连接或 window 函数,尽管使用它们可以获得相同的结果。