Db2 CASE语句,用于在另一个表中存在值时选择特定值

Db2 CASE语句,用于在另一个表中存在值时选择特定值,db2,ibm-midrange,Db2,Ibm Midrange,我有一个需求,需要按照特定顺序对存储过程返回的结果集游标中的记录进行排序。例如,假设SP返回10条记录。结果包含一个名为FLD1的字段。FLD1值出现在另一个表中的记录必须放在结果集的顶部。也就是说,当在查询(如SELECT*FROM results)中使用FLD1值时返回结果的记录,其中SELECT FLD2 FROM TABLE2中的FLD1必须放在结果集的顶部,而不返回任何记录的记录必须放在后面 我遵循的方法是首先从表2中的select FLD2中选择满足条件FLD1的记录,并分配序号1,

我有一个需求,需要按照特定顺序对存储过程返回的结果集游标中的记录进行排序。例如,假设SP返回10条记录。结果包含一个名为FLD1的字段。FLD1值出现在另一个表中的记录必须放在结果集的顶部。也就是说,当在查询(如SELECT*FROM results)中使用FLD1值时返回结果的记录,其中SELECT FLD2 FROM TABLE2中的FLD1必须放在结果集的顶部,而不返回任何记录的记录必须放在后面

我遵循的方法是首先从表2中的select FLD2中选择满足条件FLD1的记录,并分配序号1,并将结果存储在临时表中。然后在从表2中选择FLD2中选择不满足条件FLD1的记录,并为其分配序列2。最后,合并结果,并在SP末尾按序列号排序打开结果光标


请建议任何更好的方法,如果你知道一个。我正在考虑使用一个CASE语句,比如当FLD1从表2中选择FLD2,然后选择1或2时的CASE语句。但这在DB2中似乎不起作用。

因此我似乎找到了答案

诀窍是使用如下用例:

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

最后按顺序字段排序。如果有人能证实这一点,那就太好了,所以我似乎找到了答案

诀窍是使用如下用例:

CASE 
  WHEN (SELECT T41SBI FROM TC401F 
        WHERE T40BID = TC401F.T41SBI) IS NOT NULL THEN '1' 
  ELSE '2' 
END AS SEQ, 
最后按顺序字段排序。如果有人能证实这一点,那就太好了,就像这样:

select case when t2.fld2 is not null then 1 else 2 end as seq, t1.*
from table1 t1
left outer join table2 t2 on t1.fld1=t2.fld2
order by 1
就这样:

select case when t2.fld2 is not null then 1 else 2 end as seq, t1.*
from table1 t1
left outer join table2 t2 on t1.fld1=t2.fld2
order by 1
看起来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 看起来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
你能提供一些代码和测试用例吗。然后告诉我们什么是有效的,那些不起作用的有什么问题?你能提供一些代码和测试用例吗。然后告诉我们哪些行起作用了,哪些行不起作用了,这可能会在SELECT子句中对每一行运行查询。假设行是唯一的,将其作为连接执行,或者按照Espernto57的回答执行某些操作以确保唯一性,可能会产生更好的结果。如果将其放置在SELECT子句中,则可能会对每一行运行查询。假设行是唯一的,将其作为一个连接来执行,或者按照第57条的答案来确保唯一性,可能会产生更好的结果。