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...when
与left 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 中选择...然后逻辑?的主要内容,如果未能解决你的问题,请参考以下文章