我需要基于不使用动态sql的条件的结果
喜欢何时@param1=10
那么我需要table1
否则我需要来自table2的详细信息
我尝试了类似下面的内容,但它没有给出结果
declare @param1 int=10;
select * from
case when @param1=10 then table1
else table2 end
注意:我知道如果条件如下,我可以使用
if @param1=10
select * from table1
else
select * from table2
但在我的情况下,查询非常冗长,所以我不想再次替换所有查询
所以我希望我能用案例做一些事情,而不是再次替换所有查询。
请帮我解决问题
答案 0 :(得分:1)
您可以将UNION ALL
作为子查询放置,然后围绕该查询构建其余查询:
SELECT
* --TODO - Columns
FROM
(SELECT * FROM tableA WHERE @Param=10
UNION ALL
SELECT * FROM TableB WHERE @Param<>10) t
WHERE /* other conditions here */
顺便说一句 - 如果你有两个包含相同“行”类型的表,这样你就想在查询中交换它们,这可能表明你的数据模型已被破坏 - 应该是什么建模为属性而是嵌入在表名称中。例如。而不是拥有FemaleEmployees
和MaleEmployees
表,它应该是一个Employees
列,其中包含Gender
列。
答案 1 :(得分:0)
避免动态SQL的一个选项是union
:
select * from table1 where @param1 = 10
union all
select * from table2 where @param1 <> 10
答案 2 :(得分:0)
如果两个表都有一些唯一的ID加入,您可以使用类似
的内容SELECT CASE WHEN @param1 = 10 then t1.C1
ELSE t2.C1
END as C
FROM table1 t1
INNER JOIN table2 t2 on
t1.Id = t2.Id
试试这个,但你需要检查查询的性能..
Declare @t1 Table(id int , Name nvarchar(MAX))
Declare @t2 Table(id int , Name nvarchar(MAX))
Declare @t int = 10
insert into @t1 values (1,'Jhon')
insert into @t1 values (2, 'Jhon2')
insert into @t2 values (3, 'Rahul')
insert into @t2 values (4, 'Rahul2')
Select distinct Case when @t = 10 then t1.Name else t2.Name end as Name
from @t1 t1 cross join @t2 t2
另一种方法
with CTE_t1 as (Select * from table1 where @param1 = 10),
CTE_t2 as (Select * from table2 where @param1 != 10),
CTE_t3 as (Select * from CTE_t1 union all Select * from CTE_t2)
Select * -- you can use your 200 line of code here only once
from CTE_t3