SELECT col1, col2, dbo.myFunc(@param1, @param2, col1, col2) FROM theTable
我怎么在这儿加上WHERE
的功能dbo.myFunc
的结果,就像WHERE resultOfMyFunc > 10
例如?使用凡有功能的查询
SELECT col1, col2, dbo.myFunc(@param1, @param2, col1, col2) FROM theTable
我怎么在这儿加上WHERE
的功能dbo.myFunc
的结果,就像WHERE resultOfMyFunc > 10
例如?使用凡有功能的查询
只需使用在查询中选择的确切函数调用 - 查询优化器应缓存该值并在两个位置都使用它,而无需重新评估函数(至少对MSSQL至少如此)。
例如,
SELECT col1, col2, myFunc(@arg1, @arg2, col1, col2)
FROM myTable
WHERE myFunc(@arg1, @arg2, col1, col2) > 10
尝试
SELECT
col1,
col2,
dbo.myFunc(@param1, @param2, col1, col2) AS result
FROM
theTable
WHERE
result > 10;
最良好的祝愿,
费边
没有,但我希望这会工作,它看起来比重复该功能和所有方面更好。 – 2009-12-15 19:25:53
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
这不会在MS SQL 2005中起作用至少 – 2009-12-15 19:26:27
是的,这对我在使用MSSQL时一直感到沮丧。我一直希望他们能够在WHERE表达式中使用列别名,但唉,还没有(可能这在2008年有效?我仍然在2005年)。 – Dathan 2009-12-15 19:30:45
我刚刚在2008年做了一个简单的测试,看起来你不能在WHERE子句中使用列别名。 – 2009-12-15 19:44:22
你可以使用它作为你的SELECT做:
WHERE
dbo.myFunc(@param1, @param2, col1, col2) > 10
只需添加到以前的答案涵盖的另一种选择......
如果你不想重复函数调用在WHERE子句中(例如它需要一些参数,使得查询在你的眼睛中不那么可读),你可以这样做:
SELECT * FROM
(
SELECT col1, col2, dbo.myFunc(@param1, @param2, col1, col2) As funcResult
FROM theTable
) x
WHERE x.funcResult > 10
一个非常有创意的想法。 – 2009-12-15 19:49:46
对于上帝的爱。 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
不能让它以这种方式工作,你可以试着重写我的功能吗? – 2009-12-15 19:43:16
抱歉,我的意思是查询。 – 2009-12-15 19:44:23
仍然无法正常工作,它为我提供了“Invailed column”列,我为别名做了一个AS。 – 2009-12-15 19:52:20
您通常会使用您正在使用的特定RDBMS标记您的问题,从而获得更多点击。 – Dathan 2009-12-15 19:22:12