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

是否有查询可以执行此操作,还是我陷入了循环?

4

5 回答 5

1

听起来好像您有某种 Java 数组或序列号集合,也许您想检查这些数字是否在 DB2 表中找到,并且您想一次完成整个列表,而不是一次不止一个。好想法。

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

VALUES 子句

您的 FROM 子句可以是“嵌套表表达式” ,它可以是 带有相关子句的(全选) 。(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 中使用列表进行管理。

于 2013-04-11T23:47:36.173 回答
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  
于 2013-04-11T16:12:51.223 回答
0

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

SELECT cnum FROM table WHERE serial_num in ('111111', '2222222', '3333333', 'AAAAAAA'...)
于 2013-04-11T16:00:58.167 回答
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);
于 2013-04-11T16:02:03.010 回答
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
于 2013-04-11T16:09:02.647 回答