用多个where子句选择查询

stotam 发布于 2019-03-09 db2 最后更新 2019-03-09 14:32 0 浏览

我有一个序列号列表: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
有没有查询做到这一点,还是我坚持一个循环?
已邀请:

pnon

赞同来自:

听起来好像你有某种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中使用列表进行管理。

et_et

赞同来自:

尝试以下方法:

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

bquos

赞同来自:

如果仅使用“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  

wmagni

赞同来自:

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

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

funde

赞同来自:

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

 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);