0

我有两个临时表,比如#t1#t2Sql Server 2008 中。我需要创建#t3如下:

  • #t1有行,无所谓#t2的内容,#t3=select * from #t1
  • #t1没有行时,#t3=select * from #t2

我们可以假设#t1#t2拥有相同的列,但我认为我不想依赖这个事实。

我在想一些从 ' ' 语句中提取一些逻辑的东西if exists (select * ...),但是像某种 bool 运算符这样的东西不会更好吗?

4

2 回答 2

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是表达您意图的更清晰的方式。

于 2013-07-18T16:08:44.943 回答
0

该查询将执行此操作,将查看中是否有行,在这种情况下使用 的内容t1填充表,前提是它们具有相同的列,否则使用 的内容填充。t3t1t3t2

IF(select count(*) from t1) > 0 
    BEGIN 
        select * into t3 from t1
    END
ELSE
    BEGIN
        select * into t3 from t2
    END

这是一个SQLFiddle,因此您可以看到它是如何工作的。要测试t1没有任何行的情况,只需删除插入的行t1,重建模式并重新运行查询。

于 2013-07-18T16:08:30.500 回答