使用Case从sql server中的不同表中获取值

时间:2015-06-08 06:46:49

标签: sql-server sql-server-2008

我需要基于不使用动态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

但在我的情况下,查询非常冗长,所以我不想再次替换所有查询

所以我希望我能用案例做一些事情,而不是再次替换所有查询。

请帮我解决问题

3 个答案:

答案 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 */

顺便说一句 - 如果你有两个包含相同“行”类型的表,这样你就想在查询中交换它们,这可能表明你的数据模型已被破坏 - 应该是什么建模为属性而是嵌入在表名称中。例如。而不是拥有FemaleEmployeesMaleEmployees表,它应该是一个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