2012-06-27 51 views
0

我所试图做的,用java是:是否可以使用SQL Case语句来测试是否应该使用Join语句?

  • 访问数据库
  • 读取表 “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 。再次,谢谢你的时间和精力,这对我来说非常有用

编辑:经过一番修改之后,我找到了答案。谢谢你的帮助

+2

SQL是*不是程序代码。如果您声明了两种不同的“操作”,那么如果有两个不同的查询,您的意图可能会更清晰。我不知道这些查询有多复杂,但如果它们如示例所示那样简单,db命中可能甚至不会引起显着的性能差异。纯粹的猜测,但只是一个想法... – Ocelot20

回答

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有其d列同表中aA,提供的A.a的值大于2。

(这被挑选为方便起见。在我颇为人为的例子中,有条件的列不会影响输出,可以看到here)。

相关问题