我可以对下表进行查询:
表1:
id name source_url
1 object1 www.google.com
2 object2 www.facebook.com
3 object3 www.twitter.com
4 object5 www.google.com
查询:
select count(*) as counts, source_url from Table1 group by source_url
以上查询会给我以下结果:
counts source_url
2 www.google.com
1 www.facebook.com
1 www.twitter.com
现在在上面的场景中我想要的是按照我在数组中的元素集对table1进行分组。 实施例
arr[] = ["www.facebook.com","www.google.com","www.instagram.com","www.yahoo.com","www.abc.com"]
我想要的上表应该是:
counts source_url
2 www.google.com
1 www.facebook.com
0 www.instagram.com
0 www.yahoo.com
0 www.abc.com
答案 0 :(得分:0)
您需要在现有查询中将IN运算符与数据集一起应用。
select count(*) as counts, source_url from Table1 WHERE source_url IN ('www.facebook.com','www.google.com','www.instagram.com','www.yahoo.com','www.abc.com') group by source_url
编辑2: 如果您需要计算那些与您的数据集不匹配的行,那么您可以尝试内置的SQL函数。我已经提到了其中一个。 根据您的数据库,您可以找到可用的功能。
select COALESCE(count(*), 0) as counts, source_url from Table1 WHERE source_url IN ('www.facebook.com','www.google.com','www.instagram.com','www.yahoo.com','www.abc.com') group by source_url
UNION
select COALESCE(count(*), 0) as counts, source_url from Table1 WHERE source_url NOT IN ('www.facebook.com','www.google.com','www.instagram.com','www.yahoo.com','www.abc.com') group by source_url
答案 1 :(得分:0)
select source_url, count(id)
from (
select * from unnest(arr) as source_url
) as t2
left join lateral (
select source_url, id from Table1 where source_url = any(arr)
) as t1
using(source_url) group by source_url;
答案 2 :(得分:0)
将数组unnest到派生表,左连接到它并使用COALESCE()
将NULL替换为0:
SELECT COALESCE(counts, 0) AS counts, source_url
FROM unnest('{www.facebook.com,www.google.com,www.instagram.com
,www.yahoo.com,www.abc.com}'::text[]) source_url
LEFT JOIN (
SELECT count(*) AS counts, source_url
FROM Table1
GROUP BY source_url
) USING (source_url);
使用此短语法, source_url
成为派生表的表和列名。如果需要,您可以更加详细:
...
FROM unnest(your_array) AS tbl_alias(column_alias)
...