如何用一条SQL查询统计同一表单列中含两个指定关键词的记录数量
单SQL统计含指定单词评论数实现方案
核心逻辑
采用条件聚合实现单次表扫描完成两项统计,性能远优于分开执行两次COUNT查询。
通用子串匹配写法(匹配任意包含love/hate子串的评论)
适用于不需要区分独立单词的场景,兼容绝大多数SQL数据库:
SELECT SUM(CASE WHEN Text LIKE '%love%' THEN 1 ELSE 0 END) AS love_review_count, SUM(CASE WHEN Text LIKE '%hate%' THEN 1 ELSE 0 END) AS hate_review_count FROM Reviews;
独立单词精确匹配写法(排除lover/hated等包含子串但非独立单词的情况)
不同数据库的单词边界匹配语法略有差异,对应写法如下:
- MySQL 版本
SELECT SUM(CASE WHEN Text REGEXP '[[:<:]]love[[:>:]]' THEN 1 ELSE 0 END) AS love_review_count, SUM(CASE WHEN Text REGEXP '[[:<:]]hate[[:>:]]' THEN 1 ELSE 0 END) AS hate_review_count FROM Reviews;
- PostgreSQL 版本(
~*代表不区分大小写匹配,如需区分可替换为~)
SELECT SUM(CASE WHEN Text ~* '\mlove\M' THEN 1 ELSE 0 END) AS love_review_count, SUM(CASE WHEN Text ~* '\mhate\M' THEN 1 ELSE 0 END) AS hate_review_count FROM Reviews;
- SQL Server 版本
SELECT SUM(CASE WHEN Text LIKE '% love %' OR Text LIKE 'love %' OR Text LIKE '% love' OR Text = 'love' THEN 1 ELSE 0 END) AS love_review_count, SUM(CASE WHEN Text LIKE '% hate %' OR Text LIKE 'hate %' OR Text LIKE '% hate' OR Text = 'hate' THEN 1 ELSE 0 END) AS hate_review_count FROM Reviews;
如果需要忽略大小写匹配,可将Text字段先转为小写再做匹配,示例:LOWER(Text) LIKE '%love%'。
内容的提问来源于stack exchange,提问作者Ivo van den Belt
相关产品推荐
相关产品推荐

