【发布时间】:2018-04-27 15:53:53
【问题描述】:
假设我想得到所有姓史密斯的人
SELECT *
FROM Person
WHERE LastName = 'Smith'
以上都很好。但是,由于我的数据库排序规则是 CS,因此 LastName 值(如 SmItH、smith 或 SMITH)不会包含在上述结果中。
我可以的
SELECT *
FROM Person
WHERE UPPER(LastName) = 'SMITH'
这会起作用,但是查询不是 SARGable。但是,问题在于这将导致表/索引扫描而不是查找。
我知道我可以更改列或数据库排序规则,但有没有一种方法可以在不更改任何数据库的情况下使查询 SARGable?
【问题讨论】:
-
如果操作排序规则是CI,
WHERE LastName = 'Smith'会找到所有的case组合 -
尝试您的第一个查询。默认情况下,sql server 不区分大小写,因此它应该找到所有 smith 大小写组合
-
@marc_s 抱歉,我的错字 - 现在已更正
-
您应该在问题中添加您的排序规则是 CS 的信息,而不是在评论中。这是非常重要的信息
-
如果您的排序规则是 CS 并且您想要 CI 搜索,那么您就完蛋了。最接近“没有数据库更改”(例如,没有向后不兼容的更改,尽管您仍然需要更改实际查询)是计算列
AS LastName COLLATE Latin1_General_CI_AS(或类似的)上的索引。显然,这会增加存储空间,但 TANSTAAFL。
标签: sql sql-server