2015-11-23 110 views
0

我工作的內容大致如下的查詢:麻煩執行的where子句中的函數,如果條件滿足

SELECT 1 
FROM Table1 as t1 
INNER JOIN Table2 AS t2 ON t2.firstName = t1.firstName 
WHERE 
    t2.firstName='John' 
    AND t1.age > 14 

現在我想運行一個用戶定義的函數對組織檢查某些標準ID,但是只有如果ID不是空白。我試過只包括

organizationid = '' 
AND dbo.validID(organizationid) = 1 

但是由於SQL不使用短路評估,所以函數仍然運行。當它在大數據集上運行時,這會減慢速度,我試圖避免這種情況。我用下面的case聲明還嘗試:

CASE 
    WHEN t1.organizationid != '' THEN (AND dbo.validID(organizationid) = 1) 
END 

但SQL似乎並不喜歡這樣,我得到了一個不正確的語法錯誤。

如何運行此用戶定義函數,但只有如果符合某些條件?

+2

您正在使用哪些DBMS? –

+0

Microsoft sql server 2008 – ConorBaumgart

+0

步驟:1)將你的函數轉換成內聯表值函數(iTVF),2)改變你的查詢來使用iTVF,然後3)讓SQL優化器完成它的工作。 – RBarryYoung

回答

0

我必須錯過一些明顯的東西 - 爲什麼你不能這樣做?

SELECT 1 
FROM Table1 as t1 
    INNER JOIN Table2 AS t2 ON t2.firstName = t1.firstName 
WHERE 
    t1.organizationid != '' 
    AND dbo.validID(organizationid) = 1 
    AND t2.firstName='John' 
    AND t1.age > 14 

UPDATE:

我建議選擇所有的記錄,其中organizationid =「」,並把這些結果到一個臨時表,然後針對這個值validID調用執行查詢!臨時表。

+0

我試圖避免運行dbo.validID(),除非t1.organizationid!=''。該函數相當長,並且會減慢大數據集的速度,所以我只想在必要時運行它才能加快查詢速度。 – ConorBaumgart

相關問題