0

建议不要使用 where 子句中的函数。但是对于以下查询,我该如何避免呢?

SELECT empID from EmployeeTable
   WHERE UPPER(FirstName) = UPPER(LastName)

是的,这个例子过于简化了,但我说的是连接不同的表并且无法控制数据的大小写。我只需要把它写在不区分大小写的地方。

编辑:我实际上需要 Oracle 和 SQL Server 的解决方案。

4

3 回答 3

3

“建议不要使用where子句中的函数”

此建议仅适用于以下情况:

  1. 列被索引;和
  2. 我们想在搜索中使用索引。

您没有提供相关索引的详细信息,并且您说代码示例“过于简化”,因此显然我们无法给您适当的建议。但是,在 WHERE 子句中没有其他标准,因此,在不区分大小写的索引 on 的情况下(lastname, firstname),您可以从您发布的语句中获得的最好结果是对索引进行完全快速扫描。

尽管取决于命中与总行数的比率,您仍可能从全表扫描中获得更快的搜索。在这种情况下,您无论如何都不想使用索引,因此发布的查询就可以了。

此建议适用于 Oracle;我对 SQL Server 的性能知之甚少,无法说出什么在该平台上最有效。关键是查询优化是关于细节的。几乎每一个你想提到的“建议”都有例外或警告。

于 2013-03-10T10:43:00.947 回答
2

在混合大小写数据中,您无法避免 UPPER/LOWER。您可以在 Oracle 中创建基于函数的索引来提高性能:

http://docs.oracle.com/cd/B28359_01/server.111/b28318/schema.htm#CNCPT1161

http://www.oracle.com/pls/db111/to_URL?remark=ranked&urlname=http:%2F%2Fdownload.oracle.com%2Fdocs%2Fcd%2FB28359_01%2Fserver.111%2Fb28310%2Findexes003.htm%23ADMIN11730

于 2013-03-11T18:28:13.100 回答
0

用于collate定义不区分大小写的排序规则

SELECT empID from EmployeeTable
WHERE FirstName = LastName collate Latin1_General_100_CI_AS

SQLFiddle 演示

于 2013-03-10T09:56:06.717 回答