0

シリアル番号のリストがあります。値が存在するかどうかに応じて111111, 222222, AAAAAA, FFFFFF、対応する値またはテーブルから値を返したいと考えています。null

現在、シリアル番号のリストをループして、次のステートメントを使用してクエリを実行します。

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

値が返された場合は、その値を使用します。

これを 1 つのクエリとして実行し、次のような結果を得たいと思います。

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

これを行うためのクエリはありますか、それともループに陥っていますか?

4

5 に答える 5

1

ある種の Java 配列またはシリアル番号のコレクションがあるように聞こえますが、これらの番号が DB2 テーブルにあるかどうかを確認したい場合や、リスト全体を一度に実行したい場合があります。一度に1つ以上。いい考え。

したがって、対応するシリアルがテーブルにないことを示す null を使用して、テーブルへの左結合を実行できる一連の行が必要です。このアプローチを使用するために、いくつかの回答が開始されました。しかし、彼らはあなたの行番号を返しておらず、SELECT UNION を使用しています。

VALUES 句

FROM 句は 、correlation-clause を持つ(全選択)である「nested-table-expression」 にすることができます。(全選択) は、今度は VALUES 文節にすることができます。したがって、次のようなものがあります。

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

次に、これをテーブルに LEFT JOIN して、要求したような 2 列の結果テーブルを取得できます。

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 に答える
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

SQLINキーワードを使用できます。リストを動的に生成する必要がありますが、基本的には次のようになります。

SELECT cnum FROM table WHERE serial_num in ('111111', '2222222', '3333333', 'AAAAAAA'...)
于 2013-04-11T16:00:58.167 に答える
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 に答える