2016-07-24 54 views
0

我必须从两个条件的表或视图查询。我可以与如果条件,但在我的情况下它必须在一个查询中重复它,用于选择表的SQL案例

像一个过程,正在接收标志@reportType int

SELECT 
    a, b, c, d, e, f, g, h,... and so many 
FROM 
    CASE 
     WHEN @reportType = 1 
      THEN table 
      ELSE View 
    END 
INNER JOIN 
    and so on.. 

我需要写像上面却是抛出一个错误关键字

附近有语法错误“CASE”

+0

AFAIK,case表达式返回一个值,而不是标识符。它不能这样做,只能使用动态sql或if ... else条件。 –

+0

我编辑了你的问题,你可以回滚;)。 –

+0

相同:[从两个表中选择](http://stackoverflow.com/questions/36857438/select-from-either-of-two-tables/36860365) –

回答

1

在您的存储过程,你需要给我们E中的if语句来代替:

if @reportType=1 
    SELECT a,b,c FROM myTable 
else 
    SELECT a,b,c FROM myView 
+0

是的,但在我的情况下SELECT a,b ,c将会是相同的,但是myTable和myView将是有条件的,并且查询太长而不能被spiting。 –

+0

然后我只能想到两个选择。 1)使用动态SQL(将查询文本分配给'varchar'并执行它)。或者2)用两个表的内容创建一个视图,并在'where'中添加一个条件来过滤相应的表。 – Andrew

+0

我觉得我应该去为IF条件,因为这两种方式会很费时感谢 –

1

其实这看起来并不像一个很好的设计,但如果你有这个工作,并希望避免复制过去的,你可以尝试用最后的工会或一个子查询条件的CTE与工会模仿单一来源的最终查询:

;with Source_1 as 
(
    select ... 
    from myTable 
    where @reportType=1 
), 
Source_2 as 
(
    select ... 
    from myView 
    where @reportType=2 
), 
FullSource 
(
    select ... 
    from Source_1 
    union all 
    select ... 
    from Source_2 
) 
select ... 
from FullSource src 
inner join ... 

select ... 
from 
(
    select ... 
    from myTable 
    where @reportType = 1 

    union all 

    select ... 
    from myView 
    where @reportType = 2 
) src 
inner join ... 

注意,不同的可能流混淆查询优化和验证码不利于性能。对于一些更好的执行计划,您可能需要启用recompile选项。

0

您可以使用动态SQL如下:

DECLARE @reportType INT 
SET @reportType = 1 

DECLARE @q VARCHAR(max)= 'SELECT 
a, b, c, d, e, f, g, h,... and so many 
FROM '+ 
CASE 
    WHEN @reportType = 1 
     THEN 'table ' 
     ELSE 'View ' 
END+' 
INNER JOIN 
and so on..' 

EXEC(@q) 

您可能还需要以使查询参数,并防止可能的SQL注入使用sp_executesql的。

0

我认为你需要这样的查询:

;WITH mixedData AS (
    SELECT yourFields, 1 As reportType 
    FROM yourTable 
    UNION ALL 
    SELECT yourFields, 2 AS reportType 
    FROM yourView 
) 
SELECT * 
FROM mixedData 
INNER JOIN yourJoinParams 
WHERE mixedData.reportType = @reportType; 

... 
WHERE mixedData.reportType = 
     CASE WHEN @reportType = 1 THEN 1 ELSE 2 END; 

注意yourFieldsyourTableyourView相同。

HTH