是否可以使用SQL Case语句来测试是否应该使用Join语句?

时间:2012-06-27 00:48:47

标签: sql select join nested case

我尝试使用java做的是:

  • 访问数据库
  • 从“Target_stats”表中读取记录
  • 如果字段“threat_level”= 0,则执行doAction1
  • 如果字段“threat_level”> 0,从另一个表“Attacker_stats”和doAction2
  • 获取其他字段
  • 阅读下一条记录

现在我拥有了我需要的一切,但是经过深思熟虑的SQL语句只允许我只通过数据库一次,如果这不起作用我怀疑我需要使用两个单独的SQL语句并通过数据库第二次。我对case语句没有清楚的理解,所以我只使用if语句提供伪代码。

SELECT A.1, A.2, A.3
   if(A.3 > 0){
      SELECT A.1, A.2, A.3, B.1, B.3 
      FROM A 
      JOIN B 
      ON A.1 = B.1
      }
FROM A

任何人都可以了解我的情况吗?

编辑:谢谢您的时间和精力。我理解你的两个评论,我相信我更倾向于正确的方向,但我仍然遇到一些麻烦。我以前不知道SQLfiddle所以我现在已经开始做一个示例数据库,并试图证明我的目的。这是链接:http://sqlfiddle.com/#!3/ea108/1我想在这里做的是选择target_stats.server_id,target_stats.target,target_stats.threat_level其中interval_id = 3,如果threat_level> 0,我想检索attack_stats.attacker,attack_stats.sig_name其中interval_id = 3。再次,谢谢你的时间和精力对我来说非常有用

编辑:经过一些修修补补后,我想通了。非常感谢你的帮助

1 个答案:

答案 0 :(得分:1)

正如@ Ocelot20所说,SQL是不是程序代码。它基于基于集合的操作,而不是基于每行操作。这样做的一个直接后果是伪示例中的SELECT是错误的,因为它依赖于具有不同列列表的相同结果集中的行。

也就是说,如果您可以容忍无法连接的NULL值,那么您可以非常接近您的伪代码示例。

这是一个例子(对我而言)似乎接近你所驾驶的:

select *
from A 
  left outer join B 
    on A.a = B.d and A.a > 2

您可以在this SQLFiddle中看到它的实际效果,它应该显示您期望的输出类型。

请注意,这实际上是这样说的:

  

从表A中获取所有记录,并从中获取任何记录   表格B的{​​{1}}列与表格中的d列相同   a,前提是A的值大于2。

(这是为了方便而选择的。在我相当设计的例子中,移动条件列不会影响输出,因为可以看到here)。