Db2 CASE语句,用于在另一个表中存在值时选择特定值
我有一个需求,需要按照特定顺序对存储过程返回的结果集游标中的记录进行排序。例如,假设SP返回10条记录。结果包含一个名为FLD1的字段。FLD1值出现在另一个表中的记录必须放在结果集的顶部。也就是说,当在查询(如SELECT*FROM results)中使用FLD1值时返回结果的记录,其中SELECT FLD2 FROM TABLE2中的FLD1必须放在结果集的顶部,而不返回任何记录的记录必须放在后面 我遵循的方法是首先从表2中的select FLD2中选择满足条件FLD1的记录,并分配序号1,并将结果存储在临时表中。然后在从表2中选择FLD2中选择不满足条件FLD1的记录,并为其分配序列2。最后,合并结果,并在SP末尾按序列号排序打开结果光标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,
请建议任何更好的方法,如果你知道一个。我正在考虑使用一个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条的答案来确保唯一性,可能会产生更好的结果。