SQL应用collate Latin1_General_CS_AS后检测重复值及反向操作方法
SQL Server Latin1_General_CS_AS 排序规则相关问题解答
你通过添加COLLATE Latin1_General_CS_AS实现大小写敏感匹配的方案是有效的:该排序规则中CS代表大小写敏感(Case-Sensitive)、AS代表重音敏感(Accent-Sensitive),配置后TODDj与TODDJ这类仅存在大小写差异的字符串会被判定为不同值。
反向操作(切回大小写不敏感匹配)实现方式
反向操作的核心是使用带CI(Case-Insensitive,大小写不敏感)标识的排序规则覆写现有规则,分两种使用场景:
- 临时查询/匹配时使用大小写不敏感逻辑:直接在字段后追加
COLLATE Latin1_General_CI_AS即可,仅对当前语句生效,不会修改字段原有配置
-- 示例:临时大小写不敏感匹配查询 SELECT * FROM Customer WHERE CustName COLLATE Latin1_General_CI_AS = 'TODDJ' -- 该语句会匹配CustName为TODDj、toddj、TODDJ等所有仅大小写不同的记录
- 永久将字段排序规则改回大小写不敏感:执行ALTER语句修改字段属性,修改后所有默认查询都会走大小写不敏感逻辑
-- 示例:永久修改字段排序规则为大小写不敏感 ALTER TABLE Customer ALTER COLUMN CustName VARCHAR(100) -- 字段长度、类型要和原字段保持一致 COLLATE Latin1_General_CI_AS;
注意:永久修改字段排序规则前务必备份表数据,如果字段上绑定了索引、唯一约束等对象,需要先删除对应对象再执行修改,修改完成后重建即可。
字段已配置CS_AS规则时,查询、统计、报告大小写重复值的方法
这里的重复值指忽略大小写后内容一致,但实际存储大小写存在差异的记录,实现逻辑是在分组统计时临时将排序规则切换为大小写不敏感,筛出存在多写法的分组后,即可关联查询明细、生成统计报告:
- 先做聚合统计,确认存在多少组重复值、每组的出现次数
-- 重复值聚合统计 SELECT CustName COLLATE Latin1_General_CI_AS AS 基准匹配值, COUNT(*) AS 组内总记录数, COUNT(DISTINCT CustName) AS 不同大小写写法数量 FROM Customer GROUP BY CustName COLLATE Latin1_General_CI_AS HAVING COUNT(DISTINCT CustName) > 1; -- 筛选存在多种大小写写法的分组
- 查询所有重复记录的明细,方便核对
-- 查询重复值全量明细 WITH DuplicateStats AS ( SELECT CustName COLLATE Latin1_General_CI_AS AS MatchValue FROM Customer GROUP BY CustName COLLATE Latin1_General_CI_AS HAVING COUNT(DISTINCT CustName) > 1 ) SELECT t.* FROM Customer t INNER JOIN DuplicateStats s ON t.CustName COLLATE Latin1_General_CI_AS = s.MatchValue ORDER BY s.MatchValue, t.CustName;
- 生成直观的汇总报告
可以用字符串聚合函数把同一基准值下的不同写法拼接为单列,直接导出即可作为重复值报告:
-- 重复值汇总报告 SELECT CustName COLLATE Latin1_General_CI_AS AS 基准值, STRING_AGG(CustName, '、') WITHIN GROUP (ORDER BY CustName) AS 所有存在的大小写写法, COUNT(*) AS 关联记录总数 FROM Customer GROUP BY CustName COLLATE Latin1_General_CI_AS HAVING COUNT(DISTINCT CustName) > 1;
内容的提问来源于stack exchange,提问作者mtspudgun
相关产品推荐
相关产品推荐

