2009-12-15 81 views
0
SELECT col1, col2, dbo.myFunc(@param1, @param2, col1, col2) FROM theTable 

我怎么在这儿加上WHERE的功能dbo.myFunc的结果,就像WHERE resultOfMyFunc > 10例如?使用凡有功能的查询

+0

您通常会使用您正在使用的特定RDBMS标记您的问题,从而获得更多点击。 – Dathan 2009-12-15 19:22:12

回答

2

只需使用在查询中选择的确切函数调用 - 查询优化器应缓存该值并在两个位置都使用它,而无需重新评估函数(至少对MSSQL至少如此)。

例如,

SELECT col1, col2, myFunc(@arg1, @arg2, col1, col2) 
FROM myTable 
WHERE myFunc(@arg1, @arg2, col1, col2) > 10 
1

尝试

SELECT 
    col1, 
    col2, 
    dbo.myFunc(@param1, @param2, col1, col2) AS result 
FROM 
    theTable 
WHERE 
    result > 10; 

最良好的祝愿,
费边

+0

没有,但我希望这会工作,它看起来比重复该功能和所有方面更好。 – 2009-12-15 19:25:53

1
select col1, col2, dbo.myFunc(@param1, @param2, col1, col2) 
from theTable 
where dbo.myFunc(@param1, @param2, col1, col2) > 10 

或(不知道这第二个将在所有SQL版本一起使用)

select col1, col2, dbo.myFunc(@param1, @param2, col1, col2) as funcVal 
from theTable 
where funcVal > 10 
+0

这不会在MS SQL 2005中起作用至少 – 2009-12-15 19:26:27

+0

是的,这对我在使用MSSQL时一直感到沮丧。我一直希望他们能够在WHERE表达式中使用列别名,但唉,还没有(可能这在2008年有效?我仍然在2005年)。 – Dathan 2009-12-15 19:30:45

+0

我刚刚在2008年做了一个简单的测试,看起来你不能在WHERE子句中使用列别名。 – 2009-12-15 19:44:22

0

你可以使用它作为你的SELECT做:

WHERE 
    dbo.myFunc(@param1, @param2, col1, col2) > 10 
2

只需添加到以前的答案涵盖的另一种选择......

如果你不想重复函数调用在WHERE子句中(例如它需要一些参数,使得查询在你的眼睛中不那么可读),你可以这样做:

SELECT * FROM 
(
SELECT col1, col2, dbo.myFunc(@param1, @param2, col1, col2) As funcResult 
FROM theTable 
) x 
WHERE x.funcResult > 10 
+0

一个非常有创意的想法。 – 2009-12-15 19:49:46

1

对于上帝的爱。 HAVING 选择COL1,COL2,dbo.myFunc(@参数1,@ param2的,COL1,COL2) 从theTable 其中dbo.myFunc(@参数1,@ param2的,COL1,COL2)> 10

select col1, col2, dbo.myFunc(@param1, @param2, col1, col2) as calculated 
FROM theTable 
HAVING calculated > 10 
+0

不能让它以这种方式工作,你可以试着重写我的功能吗? – 2009-12-15 19:43:16

+0

抱歉,我的意思是查询。 – 2009-12-15 19:44:23

+0

仍然无法正常工作,它为我提供了“Invailed column”列,我为别名做了一个AS。 – 2009-12-15 19:52:20