用于选择表的SQL案例

时间:2016-07-24 06:03:01

标签: c# sql sql-server

我必须从表或视图中查询两个条件。如果有条件,我可以重复它,但在我的场景中,它需要在一个查询中,

类似于接收标记@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'

附近的语法不正确

4 个答案:

答案 0 :(得分:1)

在存储过程中,您需要使用if语句:

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

答案 1 :(得分:1)

实际上这看起来不是一个好的设计,但是如果你必须使用它并且希望避免复制过去,你可以尝试使用带有最终联合的条件CTE或带有union的一个子查询来模仿最终查询的单个源:

;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选项。

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

您可能还希望使用sp_executesql以使查询参数化并防止可能的SQL注入。

答案 3 :(得分: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;

请注意yourFieldsyourTable中的yourView相同。

HTH