指定"COLLATE Latin1_General_CS_AS",查询结果仍然"不区分大小写"

Tho*_*hor 2 sql t-sql sql-server

我只想从一个表中选择员工的姓氏用小写字母表示的行.但是,当我运行下面的查询时

SELECT empid, lastname
 FROM HR.Employees
 WHERE lastname COLLATE Latin1_General_CS_AS LIKE '[a-z]%';
Run Code Online (Sandbox Code Playgroud)

它返回员工姓氏以小写字母或大写字母开头的所有行.

我已经指定查询应该区分大小写COLLATE Latin1_General_CS_AS,为什么不过滤掉以大写字母开头的姓氏?

Dan*_*man 5

根据SQL Server联机丛书,范围搜索中包含的字符取决于排序规则的排序规则.排序规则Latin1_General_CS_AS使用字典顺序,因此包含指定范围的大写和小写字符.

指定二进制排序规则以获取所需的行为(97-122代码点范围中的26个ASCII字符):

SELECT empid, lastname
FROM HR.Employees
WHERE lastname COLLATE Latin1_General_BIN LIKE '[a-z]%';
Run Code Online (Sandbox Code Playgroud)

请注意,显式排序规则会导致非sargable表达式,因此即使lastname上存在索引,也需要进行完整的表/索引扫描.虽然它可能在这里没有帮助,因为大多数(如果不是全部)姓氏以字母开头,通常可以为不区分大小写的超集添加一个sargable表达式以便于索引搜索.如果使用索引,则匹配搜索谓词的行将由区分大小写的谓词另外过滤.

SELECT empid, lastname
FROM HR.Employees
WHERE lastname COLLATE Latin1_General_BIN LIKE '[a-z]%'
    AND lastname LIKE '[a-z]%';
Run Code Online (Sandbox Code Playgroud)