Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/76.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
是否可以使用SQL Case语句来测试是否应该使用Join语句?_Sql_Select_Join_Nested_Case - Fatal编程技术网

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

是否可以使用SQL Case语句来测试是否应该使用Join语句?,sql,select,join,nested,case,Sql,Select,Join,Nested,Case,我尝试使用java做的是: 访问数据库 从表“Target_stats”中读取记录 如果字段“威胁级别”=0,则doAction1 如果字段“threat_level”>0,则从另一个表“攻击者_stats”和doAction2获取其他字段 读下一条记录 现在我拥有了我所需要的一切,但是一个经过深思熟虑的SQL语句只允许我遍历数据库一次,如果这不起作用,我怀疑我将需要使用两个单独的SQL语句并再次遍历数据库。我对case语句没有清晰的理解,所以我将使用if语句提供伪代码 SELECT A.1

我尝试使用java做的是:

  • 访问数据库
  • 从表“Target_stats”中读取记录
  • 如果字段“威胁级别”=0,则doAction1
  • 如果字段“threat_level”>0,则从另一个表“攻击者_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,所以现在我开始制作一个示例数据库,并试图证明我的目的。这里是链接:我想在这里做的是选择target_stats.server_id,target_stats.target,target_stats.threat_level,其中interval_id=3,如果威胁等级>0,我想检索attack_stats.attacker,attack_stats.sig_name,其中interval_id=3。再次感谢你的时间和努力,这对我很有用

编辑:经过一番修修补补,我终于找到了答案。非常感谢您的帮助

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

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

以下是一个(对我来说)似乎与您的目的非常接近的示例:

select *
from A 
  left outer join B 
    on A.a = B.d and A.a > 2
您可以在中看到它的实际作用,这将向您显示预期的输出类型

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

从表
A
中获取所有记录,并从 表
B
d
列与表中的
a
列相同
A
,前提是
A.A
的值大于2

(这是为了方便起见而选择的。在我精心设计的示例中,移动条件列不会影响输出,正如可以看到的那样)。

SQL不是过程代码。如果有两个不同的“动作”,如果有两个不同的查询,阅读代码的人可能会更清楚您的意图。我不知道这些查询有多复杂,但如果它们像示例所示那样简单,那么db命中可能甚至不会产生明显的性能差异。纯粹的猜测,但只是一个想法。。。