2009-12-15 80 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