2013-07-11 66 views
4

我當它是不是null這樣用子查詢選擇避免多次運行?

Select 
    Col_A 
    ,Col_B 
    ,Col_C 
    ,CASE 
     WHEN (SELECT ...{a very complicated query}...) IS NOT NULL THEN 1 
     ELSE 0 
    END CASE AS Col_D 
FROM 
    MyTable 

產生Col_D的子查詢,返回一個整數。

我需要顯示Col_D的位,但我也需要顯示它返回的INT。通常情況下,我只是重寫子查詢並將其稱爲Col_E,但考慮到它的複雜性,我並不想真正運行它兩次。理想情況下,我會:

Select 
    Col_A 
    ,Col_B 
    ,Col_C 
    ,(SELECT ...{a very complicated query}...) AS Col_E 
    ,CASE 
     WHEN Col_E IS NOT NULL THEN 1 
     ELSE 0 
    END CASE AS Col_D 
FROM 
    MyTable 

我有任何選擇嗎? (MS SQL 2008)

編輯: 對不起 - 我應該提到的是,複雜的查詢包括基於我列的where子句,即

SELECT ...{a very complicated query}... WHERE X = Col_A AND Y = Col_B 
+0

我認爲要得到一個答案,你需要提供更多關於什麼是一個非常複雜的查詢的信息,以及它與查詢中其他列的關係。你可以用這些結果創建一個臨時表,然後用'JOIN'來代替使用'SELECT'的操作系統,然後在'JOINED'行運行你的'CASE'? –

回答

3

所以,如果您的查詢的結果都只有一個值或空,你可以使用:

Select 
    Col_A 
    ,Col_B 
    ,Col_C 
    ,CASE 
     WHEN t.whatevercol IS NOT NULL THEN 1 
     ELSE 0 
    END CASE AS Col_D, 
    t.whatevercol 
FROM 
    MyTable, (SELECT ...{a very complicated query}...) t 

千萬要小心,因爲這可能會導致笛卡爾積但如果有多種潛在回報。如果有可以加入的字段,這可能是更好的方法(並且由於您正在檢查NULL,因此您可能需要一個OUTER JOIN)。

2

可以嵌套在另一個SELECT返回Col_E查詢,並在它的上面添加Col_D,像這樣:

SELECT 
    Col_A 
    ,Col_B 
    ,Col_C 
    ,Col_E 
    , CASE 
     WHEN Col_E IS NOT NULL THEN 1 
     ELSE 0 
    END CASE AS Col_D 
FROM (
    Select 
     Col_A 
     ,Col_B 
     ,Col_C 
     ,(SELECT ...{a very complicated query}...) AS Col_E 
    FROM 
     MyTable 
) X 

這樣你就不會需要複製的查詢,因爲其結果將是可用於外部SELECT

+0

+1。 。 。此解決方案適用於更復雜的情況,即「非常複雜的查詢」是相關的子查詢。 –