SQL视图(如果声明)

时间:2016-08-12 21:15:19

标签: sql sql-server

我有两个不同的视图,它们具有相同的精确列,但数据不同。它们的调用取决于键的值。

现在,我可以在某个地方集中处理,而不是使用带有if语句的sql函数。就像带有IF语句的新视图一样? (我知道这是不可能的)

更新

根据下面的评论,我需要创建一个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
    )

由于

2 个答案:

答案 0 :(得分: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 :(得分:0)

您可以看一下:

两个视图都返回两列string-type。

过程/ ad-hoc 方法应该更快,因为过程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;