SQL从案例或IF中选择...那么逻辑?

时间:2015-03-20 12:39:23

标签: sql advantage-database-server

我试图消除对数据库进行帖子传递,并且这样做遇到了这个问题。

场景是我需要加入一个每个项目有很多行的表。考虑日期值,项目x在日期y的值为n。在日期x和z处,同一项目也有一行。

我无权改变这张表。

我试图做的事情就是这样:

Select 
table1.Name as name, 
table1.date as date,

if (date > x)
   select table2.value as value,
   table2.othervalue as otehrvalue
   from table 2
   where table1.x = table2.x

from table1
但是我遇到了困难。 我已成功使用字符串运行测试条件,因此如果日期> x显示一个字符串等等,但我似乎无法让选择工作(如果可能的话),我不知道我哪里出错了。我已经在网上看了一下,发现并没有太多让我觉得我可能会咆哮错误的树......

我们正在使用Advantage DB。

任何帮助表示赞赏

编辑为我可以从子查询中返回多个值...

2 个答案:

答案 0 :(得分:2)

使用CASE表达式:

select table1.Name as name,
       table1.date as date,
       case when date > x then
           (select table2.value
            from table2
            where table1.x = table2.x)
       end as value
from table1

当date< = x。

时将返回NULL

注意,如果子选择返回多行,您将收到错误!

答案 1 :(得分:2)

您还可以将case...whenleft outer join

一起使用
Select 
  table1.Name as name, 
  table1.date as date,
  case when table1.date > x
     then table2.value
     else null
  end as value
from table1
  left join table2
  on table1.x = table2.x;

编辑,回复:有条件地从表2中返回多个列

是的,您应该能够为多个列执行此操作,方法是使用date > x作为连接条件,并保留左外连接(这将再次为任何失败的连接投影NULL),最后使用COALESCE将任何NULL恢复为Table1条件:

Select 
  table1.Name as name, 
  table1.date as date,
  COALESCE(table2.x, table1.x) as x,
  COALSECE(table2.y, table1.y) as y
from table1
  left join table2  
  on table1.x = table2.x AND table1.date > x;