CASE语句,如果另一个表中存在值,则选择特定值

时间:2017-06-05 06:53:40

标签: db2 ibm-midrange

我有一个要求,我需要按特定顺序对存储过程返回的结果集游标中的记录进行排序。例如,假设SP返回10条记录。结果包含名为FLD1的字段。 FLD1值存在于另一个表中的记录必须放在结果集的顶部。这是在SELECT * FROM RESULTS WHERE FLD1 IN (SELECT FLD2 FROM TABLE2)之类的查询中使用FLD1值返回结果的记录必须放在结果集的顶部,并且之后不会返回任何记录的记录。

我遵循的方法是首先选择满足条件FLD1 IN (SELECT FLD2 FROM TABLE2)的记录并分配seq.no 1并将结果存储在临时表中。然后选择不满足条件FLD1 IN (SELECT FLD2 FROM TABLE2)的记录并为它们分配序列2.最后,合并结果并在序列号的SP排序结束时打开结果光标。

如果你知道一个,请建议任何更好的方法。我正在考虑使用像CASE WHEN FLD1 IN (SELECT FLD2 FROM TABLE2) THEN "1" ELSE "2"这样的CASE语句。但这似乎在DB2中不起作用。

3 个答案:

答案 0 :(得分:2)

就像这样:

8.0.0.13

答案 1 :(得分:0)

所以我似乎找到了答案。

诀窍是用例如下:

CASE 
  WHEN (SELECT T41SBI FROM TC401F 
        WHERE T40BID = TC401F.T41SBI) IS NOT NULL THEN '1' 
  ELSE '2' 
END AS SEQ, 

最后按SEQ字段排序。如果有人可以验证这一点,那就太棒了

答案 2 :(得分:0)

IN语句中CASE谓词无效。

只要假设是正确的,这对我有用:

create table test1
  (field1 Char(25),
   field2 Char(5));

create table test2
  (field1 Char(5),
   descrip Char(25));

insert into test1
  values  ('This is line 1', 'OK'),
          ('This is line 2', 'FAIL'),
          ('This is line 3', 'OK'),
          ('This is line 4', 'FAIL');

insert into test2
  values ('OK', 'This is a valid code');

select field1, 
       field2,
       case
         when (select field2 from test2 
               where a.field2 = field1) is not null then '1'
         else '2'
       end seq
  from test1 a
  order by 3, 1;

结果是:

FIELD1          FIELD2  SEQ
==============  ======  ===
This is line 1   OK      1
This is line 3   OK      1
This is line 2   FAIL    2
This is line 4   FAIL    2