假设我有一个包含商店交易的表。
如何计算其中包含“crackers”一词的交易数量,其中包含“soda”的交易数量,以及同时包含“crackers”和“soda”的交易数量
如果可能,这应该在一个查询中。
答案 0 :(得分:2)
您可以使用conditional aggregation
:
select
sum(case when field like '%crackers%' then 1 else 0 end) crackercount,
sum(case when field like '%soda%' then 1 else 0 end) sodacount,
sum(case when field like '%soda%'
and field like '%crackers%' then 1 else 0 end) bothcount
from yourtable
答案 1 :(得分:2)
在 Postgres 9.4 或更高版本中,使用专用的aggregate FILTER
clause:
SELECT count(*) FILTER (WHERE col ILIKE '%crackers%') AS ct_cracker
, count(*) FILTER (WHERE col ILIKE '%soda%') AS ct_soda
, count(*) FILTER (WHERE col ILIKE ALL ('{%crackers%, %soda%}'::text[]) AS ct_both
FROM tbl
WHERE col ILIKE ANY ('{%crackers%, %soda%}'::text[]);
有一些标准技术适用于旧版本或MySQL:
假设您需要不区分大小写的模式匹配,因此ILIKE
。
ANY
和ALL
结构是方便的功能,特别是对于较长的数组,但对于您的问题并非严格必需。此外,并不严格需要WHERE
子句,但通常会提高性能。
详细说明: