2014-03-05 91 views
0

我正在使用SQL Server 2012並試圖在CTE中運行3個單獨的語句。CTE表...使用CASE語句填充它

喜歡的東西:

WITH C1 AS 
(
    if (@Param = 1) 
     SELECT Field1, Field2 FROM TableA 
    else if (@Param = 2) 
     SELECT Field1, Field2 FROM TableB 
    else 
     SELECT Field1, Field2 FROM TableC 
), 
C2 AS 
    Select xxxxx 

,但它不是編譯。

這是可能的嗎?

+0

可能重複[?如果其他內CTE(http://stackoverflow.com/questions/2907344/if-else-在 - cte) –

+0

@RegisteredUser ..它看起來像一個重複。感謝您傳遞鏈接,它提供了非常有趣的答案。 –

回答

1

不,公用表表達式不支持其他塊。公用表表達式基本上是內聯視圖。

2

您可以更改Select的CTE這樣的工作:

WITH C1 AS 
(

     SELECT Field1, Field2 FROM TableA WHERE @Param = 1 
    UNION ALL 
     SELECT Field1, Field2 FROM TableB WHERE @Param = 2 
    UNION ALL 
     SELECT Field1, Field2 FROM TableC WHERE @Param <> 1 and @Param <> 2 
), 
C2 AS 
    Select xxxxx 
+0

有趣...我會嘗試! –

+0

假設select的方式更爲複雜,運行Union All會出現性能問題,或者SQL很聰明,知道@Param是第一件要檢查的東西? –

+2

我不知道答案,試試看。一般來說,我發現使用臨時表代替CTE通常可以顯着提高查詢速度。我確信有反例,但那是我的經歷。 –