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