跨多行的 jsonb 数组中的 PostgreSQL 计数结果
PostgreSQL count results within jsonb array across multiple rows
如标题中所述,我处于需要 return 数组(即 jsonb 列)内出现次数的情况。伪例子如下:
CREATE TABLE users (id int primary key, tags jsonb);
INSERT INTO users (id, j) VALUES
(1, '{"Friends": ["foo", "bar", "baz"]}'),
(2, '{"Friends": ["bar", "bar"]}');
- 请注意,朋友的值可以多次包含相同的值。这将在稍后相关(在这种情况下,第二个值包含在键 "Friends" 下的 jsonb 列中两次包含名称 "bar"。)
问题:
对于上面的示例,如果我要搜索值 "bar"(给定一个我需要帮助解决的查询),我希望 "bar" 出现在 j 中的次数(jsonb) 键中的列 "Friends";在这种情况下,我要寻找的最终结果是整数 3。因为术语 "bar" 在 2 行中出现 3 次。
我所在的位置:
目前我已经 sql 编写,return 是一个文本数组,其中包含单个一维数组中的所有朋友值(来自多个选定行)。即sql如下
SELECT jsonb_array_elements_text(j->'Friends') FROM users;
生成结果如下:
jsonb_array_elements_text
-------------------------
foo
bar
baz
bar
bar
- 鉴于这是一个数组,是否可以以某种方式通过术语 "bar" 对其进行过滤以获得它出现的次数?还是我的方法偏离了方向?
其他详情:
- 版本:psql (PostgreSQL) 9.5.2
- 有问题的 table 及其上的杜松子酒索引。
如果需要任何其他信息,请告诉我,在此先感谢。
你需要把函数的结果当做一个合适的table,然后你就可以很方便的统计出这个值出现的次数
select count(x.val)
from users
cross join lateral jsonb_array_elements_text(tags->'Friends') as x(val)
where x.val = 'bar'
如标题中所述,我处于需要 return 数组(即 jsonb 列)内出现次数的情况。伪例子如下:
CREATE TABLE users (id int primary key, tags jsonb);
INSERT INTO users (id, j) VALUES
(1, '{"Friends": ["foo", "bar", "baz"]}'),
(2, '{"Friends": ["bar", "bar"]}');
- 请注意,朋友的值可以多次包含相同的值。这将在稍后相关(在这种情况下,第二个值包含在键 "Friends" 下的 jsonb 列中两次包含名称 "bar"。)
问题:
对于上面的示例,如果我要搜索值 "bar"(给定一个我需要帮助解决的查询),我希望 "bar" 出现在 j 中的次数(jsonb) 键中的列 "Friends";在这种情况下,我要寻找的最终结果是整数 3。因为术语 "bar" 在 2 行中出现 3 次。
我所在的位置:
目前我已经 sql 编写,return 是一个文本数组,其中包含单个一维数组中的所有朋友值(来自多个选定行)。即sql如下
SELECT jsonb_array_elements_text(j->'Friends') FROM users;
生成结果如下:
jsonb_array_elements_text
-------------------------
foo
bar
baz
bar
bar
- 鉴于这是一个数组,是否可以以某种方式通过术语 "bar" 对其进行过滤以获得它出现的次数?还是我的方法偏离了方向?
其他详情:
- 版本:psql (PostgreSQL) 9.5.2
- 有问题的 table 及其上的杜松子酒索引。
如果需要任何其他信息,请告诉我,在此先感谢。
你需要把函数的结果当做一个合适的table,然后你就可以很方便的统计出这个值出现的次数
select count(x.val)
from users
cross join lateral jsonb_array_elements_text(tags->'Friends') as x(val)
where x.val = 'bar'