我必须从表或视图中查询两个条件。如果有条件,我可以重复它,但在我的场景中,它需要在一个查询中,
类似于接收标记@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 :(得分: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;
请注意yourFields
和yourTable
中的yourView
相同。
HTH