2016-08-12 47 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