2016-08-12 44 views
0

我有兩個不同的視圖,它們具有相同的確切列,但數據不同。它們根據密鑰的值被調用。SQL視圖(如果語句)

現在,我可以做一個集中​​的地方,而不是我的SQL函數與if語句,而不是。像使用IF語句的新視圖一樣? (我知道這是不可能的)

UPDATE

基於下面的評論,我需要創建一個SQL表函數,你可以幫我用下面的代碼?

CREATE FUNCTION GetCorrectData (@id INT) 
RETURNS TABLE 
AS 
RETURN 
    ( 

    SELECT *  FROM  view1 
    -- how to add the if here for view 2? 
    --if @id=10 then view1 else view2 
    ) 

感謝

+1

SQL不支持將密鑰傳遞到視圖中。幾個數據庫支持基本上具有此功能的表值函數。 –

+0

那麼一個表值函數可以工作嗎? – piris

+0

這將符合你想要做的事情的要求。 –

回答

0

您可能會看到:

這兩個視圖都返回兩列字符串類型。

內嵌/特設的做法應該是更快IF程序方法。內聯函數是可預測的,優化器將能夠使用索引和統計信息。

CREATE VIEW dbo.Test1 AS 
SELECT COLUMN_NAME,TABLE_NAME FROM INFORMATION_SCHEMA.COLUMNS; 
GO 

CREATE VIEW dbo.Test2 AS 
SELECT TABLE_SCHEMA,TABLE_NAME FROM INFORMATION_SCHEMA.TABLES 
WHERE TABLE_TYPE='BASE TABLE'; 
GO 

CREATE FUNCTION dbo.MyFunc(@key INT) 
RETURNS TABLE 
AS 
RETURN 
SELECT * FROM dbo.Test1 WHERE @Key=1 
UNION ALL 
SELECT * FROM dbo.Test2 WHERE @Key=2; 
GO 

SELECT * FROM dbo.MyFunc(1); --try 2 as well 
GO 

DROP FUNCTION dbo.MyFunc; 
DROP VIEW dbo.Test2; 
DROP VIEW dbo.Test1; 
+0

這很有趣,我也會試試。 – piris

1

另一種方法是創建一個新的觀點,例如,

CREATE VIEW view3 AS 
SELECT a.*, 'view_1' as view_type 
FROM view1 a 
UNION ALL 
SELECT b.*, 'view_2' as view_type 
FROM view2 b 

然後你就可以從SELECT * from view3 WHERE view_type ='view_1'特定視圖查詢數據。

+1

根據表的大小,這可能會變得很慢... – Shnugo

+0

大小意見是非常大的,這不是一個選項 – piris

+1

@Shnugo:我會試試看,無論表大小如何,像樣的優化器都會執行謂詞推送並生成多個執行計劃,就像查詢每個視圖一樣分開。 – a1ex07