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,为什么不过滤掉以大写字母开头的姓氏?
根据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)
| 归档时间: |
|
| 查看次数: |
5541 次 |
| 最近记录: |