SQL 从 case 或 IF 中选择...然后逻辑?

Posted

技术标签:

【中文标题】SQL 从 case 或 IF 中选择...然后逻辑?【英文标题】:SQL Select from case or IF...Then logic? 【发布时间】:2015-03-20 12:39:22 【问题描述】:

我正在尝试避免将帖子传递到数据库中,但这样做时遇到了这个问题。

场景是我需要加入一个每个项目有很多行的表。考虑日期值,项目 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

但我遇到了困难。 我已经成功地使用字符串运行了测试条件,所以如果 date > x 显示一个字符串等等,但我似乎无法让选择工作(如果可能的话)而且我不确定我哪里出错了。我在网上查了一下,没有发现太多可做的事情,这让我觉得我可能找错了树...

我们正在使用 Advantage DB。

任何帮助表示赞赏

已编辑,因为我想从子查询中返回多个值...

【问题讨论】:

您使用的是 mysql 和/或 SQL Server 吗? (不要标记未涉及的产品。) 如果日期不大于 x 会是什么? @AbhikChakraborty - 嗨,日期是一个范围,表格有一个有效的日期和一个有效的起始日期。 :) 【参考方案1】:

使用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

当日期

注意,如果子选择返回多行,你会得到一个错误!

【讨论】:

谢谢,如果我想返回多个字段,这仍然可行吗?所以选择 table2.x、table2.y 等。我返回一个错误,说子查询返回多个列,这当然是正确的,但想知道是否有解决方法? 如果你想要两个(或更多)列,你可以做一个连接,就像在 StuartLC 的回答中一样。如果您在子查询中有不止一行,您可以执行连接解决方​​案,或限制子查询。 (获取最大值或获取限制等),具体取决于您想要的结果。【参考方案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),最后使用 @987654325 @ 将任何 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;

【讨论】:

谢谢,如果我想返回多个字段,这仍然可行吗?所以选择 table2.x、table2.y 等。我返回一个错误,说子查询返回多个列,这当然是正确的,但想知道是否有解决方法? 是的,我相信您可以按照我的编辑中的说明进行操作。

以上是关于SQL 从 case 或 IF 中选择...然后逻辑?的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server 2008 - SELECT 子句中的 Case / If 语句 [重复]

SQL CASE语句

Case or If,在 SQL 中选择啥

if语句中可以没有case

使用 if 或 case 在 SQL 中进行条件更新

在 SQL 中使用 IF/ELSE 重复 CASE 块