选择具有多个where子句的查询

时间:2013-04-11 15:52:33

标签: java sql db2

我有一个序列号列表:111111, 222222, AAAAAA, FFFFFF我希望从表中返回相应的值或null,具体取决于值是否存在。

目前我遍历我的序列号列表,使用以下语句进行查询:

"SELECT cnum FROM table WHERE serial_num = " + serialNumber[i];

然后使用该值,如果返回一个。

我更愿意这样做是一个查询,并获得类似于:

的结果
 Row | cnum
 ------------
   1 |  157
   2 |  4F2
   3 |  null
   4 |  93O
   5 |  null
   6 |  9F3

是否有查询要执行此操作,还是我遇到了循环?

5 个答案:

答案 0 :(得分:1)

如果只使用“in”,则不会为缺失值返回null,从而迫使您在应用程序中进行一些编码(可能是最有效的方法)。

如果您希望数据库完成所有工作(可能是也可能不是理想的) 无论如何,你都必须欺骗db2返回你的列表。

这样的东西可能会起作用,伪造从sysdummy返回的空值与公共表表达式(带有部分):

with all_serials as (
select '111111' as serialNumber from sysibm.sysdummy1 union all ,
select '222222' as serialNumber from sysibm.sysdummy1 union all ,
select 'AAAAAA' as serialNumber from sysibm.sysdummy1 union all ,
select 'FFFFFF' as serialNumber from sysibm.sysdummy1 
) 
select 
    t1.serialNumber, 
    t2.serialNumber as serialNumberExists
from 
    all_serials  as t1 left outer join 
    /* Make sure the grain of the_Table is at "serialNumber" */ 
    the_table    as t2 on t1.serialNumber = t2.serialNumber  

答案 1 :(得分:1)

听起来好像你有某种Java数组或序列号集合,也许你想检查一下这些数字是否在DB2表中找到,并且你想要全部列出所有数据。一次,而不是一次一次。很好的想法。

因此,您希望拥有一组行,您可以使用这些行对表进行左连接,null表示相应的序列不在表中。几个答案已经开始使用这种方法。但是他们没有返回你的行号,他们正在使用SELECT UNION,这似乎是一种全面的方式来获得你想要的东西。

VALUES条款

您的FROM子句可以是"nested-table-expression" 可以是(fullselect) 带有相关条款。反过来,(全选)可以是VALUES子句。所以你可以这样:

FROM (VALUES (1, '157'), (2, '4F2'), (3, '5MISSING'), (4, '93O'), ...
     ) as Lst (rw, sn)

然后你可以将这个LEFT JOIN加入到表中,并获得一个两列结果表,就像你要求的那样:

SELECT Lst.rn, t.serial_num
  FROM (VALUES (1, '157'), (2, '4F2'), (3, '5MISSING'), (4, '93O'), ...
       ) as Lst (rw, sn)
  LEFT JOIN sometable t   ON t.serial_num = Lst.sn

使用此方法,您可能需要一个循环来使用集合中的值来构建动态SQL语句字符串。

如果它是嵌入式SQL,我们可能能够引用包含序列号的主机数组变量。但是,在Java中,我不知道如何在不使用某些循环的情况下直接在SQL中使用列表进行管理。

答案 2 :(得分:0)

您可以使用SQL IN关键字。您需要动态生成列表,但基本上它看起来像:

SELECT cnum FROM table WHERE serial_num in ('111111', '2222222', '3333333', 'AAAAAAA'...)

答案 3 :(得分:0)

我不确定我是否能帮到你,但这可能有所帮助:

 String query = "SELECT cnum FROM table WHERE ";
 for(int i = 0; i < serialNumber.length; i++)
      query += "serial_num='" + serialNumber[i] + "' OR ";
 query += "serial_num IS NULL "
 System.out.println(query);

答案 4 :(得分:0)

尝试类似:

select t.cnum 
from 
(select '111111' serial_num from sysibm.sysdummy1 union all
 select '222222' serial_num from sysibm.sysdummy1 union all
 select 'AAAAAA' serial_num from sysibm.sysdummy1 union all
 select 'FFFFFF' serial_num from sysibm.sysdummy1) v
left join table t on v.serial_num = t.serial_num