SQL Server优化查询:按指定列表值统计内容列的不区分大小写出现次数
最优SQL Server查询语句实现指定值的出现次数统计
针对需求,以下是高效的SQL Server查询方案,可统计目标列表中每个值在myTable.Content列的出现次数(包含计数为0的项),且支持不区分大小写搜索:
基础实现方案
SELECT SearchValue, COUNT(t.ID) AS OccurrenceCount FROM ( -- 定义需要统计的目标值集合 VALUES ('Hello'), ('Hi'), ('Yes'), ('content') ) AS SearchValues(SearchValue) LEFT JOIN myTable t -- 不区分大小写的子串匹配:统一转为小写后判断包含关系 ON LOWER(t.Content) LIKE '%' + LOWER(SearchValue) + '%' GROUP BY SearchValue ORDER BY SearchValue;
方案说明
- 构造目标值数据集:通过
VALUES子句将给定字符串列表转为独立行数据,确保所有需统计的项都被纳入结果,包括无匹配的项(如示例中的"Yes")。 - 左连接保留全量值:使用
LEFT JOIN关联原表,保证即使原表无匹配记录,目标值也会被保留,对应计数为0。 - 不区分大小写匹配:通过
LOWER()函数将列值和搜索值统一转为小写实现匹配;也可指定不区分大小写的排序规则替代,写法为:ON t.Content LIKE '%' + SearchValue + '%' COLLATE SQL_Latin1_General_CP1_CI_AS - 计数逻辑:
COUNT(t.ID)会忽略左连接后无匹配行的NULL值,精准统计每个搜索值的匹配行数。
大数据量优化方案
如果myTable数据量较大,LIKE '%...%'性能会受影响,可通过创建全文索引并使用CONTAINS函数提升匹配效率:
-- 需预先对Content列创建全文索引 SELECT SearchValue, COUNT(t.ID) AS OccurrenceCount FROM ( VALUES ('Hello'), ('Hi'), ('Yes'), ('content') ) AS SearchValues(SearchValue) LEFT JOIN myTable t ON CONTAINS(t.Content, SearchValue) GROUP BY SearchValue ORDER BY SearchValue;
注意事项
CONTAINS基于词匹配,若需要精确的子串匹配(如匹配"content"在"testcontent"中的情况),仍需使用LIKE配合大小写转换的方案。
内容的提问来源于stack exchange,提问作者Het Shah
相关产品推荐
相关产品推荐

