我有两个临时表,在Sql Server 2008中说#t1
和#t2
。我需要创建#t3
,例如:
#t1
有行时,对#t2
的内容漠不关心,#t3
= select * from #t1
#t1
没有行时,#t3
= select * from #t2
我们可以假设#t1
和#t2
具有相同的列,但我认为我不想依赖这一事实。
我在考虑从“if exists (select * ...)
”语句中汲取一些逻辑,但不会像某种bool运算符那样更好吗?
答案 0 :(得分:2)
最简单的方法是将逻辑实现为:
if (exists (select * from #t1))
begin
select *
into #t3
from #t1;
end;
else
begin
select *
into #t3
from #t2;
end;
您可以在一个声明中执行此操作:
select t.*
into #t3
from ((select *
from #t1
)
union all
(select *
from #t2
where not exists(select * from #t1)
)
) t
但是,我认为明确的if
是表达意图的更明确的方式。
答案 1 :(得分:0)
这个查询会这样做,会查看t1
中是否有行,并且在这种情况下填充表t3
的内容为t1
,前提是它们具有相同的列,否则它会t3
填充t2
的内容。
IF(select count(*) from t1) > 0
BEGIN
select * into t3 from t1
END
ELSE
BEGIN
select * into t3 from t2
END
这是一个SQLFiddle所以你可以看到它是如何工作的。要测试t1
没有任何行的情况,只需删除插入t1
的行,重建模式并重新运行查询。