我有一个要求,我需要按特定顺序对存储过程返回的结果集游标中的记录进行排序。例如,假设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中不起作用。
答案 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