2009-04-21 75 views
0

大多数SQL查询对where子句没有数学操作。为什么'MS SQL中的数学函数在Where子句中'?

让他们在'where子句'上有什么问题? 是否有任何性能问题?

例如:

SELECT * FROM雇员薪水WHERE * 3 = 5000

+0

你问什么类型的数学运算的? – 2009-04-21 10:43:18

+1

请举个例子,你的问题现在太模糊了,不能回答。 – 2009-04-21 10:43:30

回答

11

如果where子句可以利用一个索引,它通常(但不总是)更快。在字段上使用数学运算将停止使用索引。例如,如果您有一个包含一百万行的表和一个已编制索引的日期列,则查询1在此远远超出查询2(它们都会检索所有日期在过去7天内的行) :

查询1:

select date from table where date > dateadd(d, -7, getdate()) 

查询2:

select date from table where dateadd(d, 7, date) > getdate() 

在您的例子,第e查询会好得多:

select * from employee where salary = (5000/3) 
+0

对于一个很好的样本+1 ... – Lucero 2009-04-21 10:48:58

1

咦?不,在一个where子句中有数学是没有问题的。 where子句可以包含任何使用列名称,函数或常量的表达式,只要表达式是合法谓词即可。

CK提供了以下两个例子:

选择日期从表,其中日期> DATEADD(d,-7,GETDATE())

从表

选择日期其中DATEADD(d,7,日期)> getdate()

并解释第一个可能更快,因为它可以使用索引。

ck的正确,但也应该注意,第一个可以更快,因为dateadd(d, -7, getdate())是一个常量表达式(只需要计算一次,无论行数是多少),而dateadd(d, 7, date)需要评估为每一行。

但是都是 ck的例子是在where子句中使用的“数学”(表达式)的例子,这是OP所要求的。

1

你能举个例子......你可以用某些功能

SELECT filter, count(*) FROM Test GROUP BY filter HAVING count(*) > 1 

,如果你想在MAXMIN等使用HAVING条款同样的逻辑也适用于在WHERE子句后使用HAVING条款..

为了您的例子中,你需要围绕工资* 3括号

WHERE (Salary * 3) > 5000