我有一个序列号列表: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
是否有查询要执行此操作,还是我遇到了循环?
答案 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,这似乎是一种全面的方式来获得你想要的东西。
您的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