SQL Server查询LOWER(Zipcode)<>UPPER(Zipcode)无结果,求排查
问题原因及解决办法
核心原因
问题出在数据库的**排序规则(Collation)**设置上:
- 如果你的
Zipcode列使用了**不区分大小写(Case Insensitive,简称CI)**的排序规则,数据库在执行字符串比较时会忽略大小写差异。 - 哪怕你单独查询能看到
LOWER(Zipcode)和UPPER(Zipcode)返回的字符外观不同,但在<>比较时,数据库会按照排序规则判定二者相等,因此不会返回任何结果。
验证方式
先确认Zipcode列的排序规则,执行以下查询:
SELECT COLUMN_NAME, COLLATION_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'Addresses' AND COLUMN_NAME = 'Zipcode'
如果返回的COLLATION_NAME包含CI(比如SQL_Latin1_General_CP1_CI_AS),就说明是不区分大小写的排序规则导致的问题。
解决方法
方法1:强制区分大小写的比较
在比较时指定区分大小写的排序规则(CS代表Case Sensitive):
SELECT ID, Zipcode FROM Addresses WHERE LOWER(Zipcode) COLLATE SQL_Latin1_General_CP1_CS_AS <> UPPER(Zipcode) COLLATE SQL_Latin1_General_CP1_CS_AS
方法2:直接匹配小写字符
用通配符直接筛选包含小写字母的记录(需指定区分大小写排序规则):
-- SQL Server 示例 SELECT ID, Zipcode FROM Addresses WHERE Zipcode LIKE '%[a-z]%' COLLATE SQL_Latin1_General_CP1_CS_AS
内容的提问来源于stack exchange,提问作者Stefan van Roosmalen
相关产品推荐
相关产品推荐

