【问题标题】:CASE Statement to select a particular value if value exists in another table如果值存在于另一个表中,则 CASE 语句选择特定值
【发布时间】:2017-06-05 06:53:40
【问题描述】:

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

【问题讨论】:

  • 能否提供一些代码和测试用例。然后告诉我们哪些有效,哪些无效?

标签: db2 ibm-midrange


【解决方案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

【讨论】:

    【解决方案2】:

    所以我似乎找到了答案。

    诀窍是用例如下:

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

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

    【讨论】:

    • 如果放在SELECT 子句中,这可能运行每一行的查询。将其作为连接进行(假设行是唯一的,或者做一些事情来确保唯一性),如 Esperento57 的答案可能会产生更好的结果。
    【解决方案3】:

    看起来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 序列 ======================== 这是第 1 行 OK 1 这是第 3 行 OK 1 这是第 2 行失败 2 这是第 4 行失败 2

    【讨论】:

      猜你喜欢
      • 2014-02-21
      • 1970-01-01
      • 2019-03-05
      • 2015-11-13
      • 1970-01-01
      • 1970-01-01
      • 2011-02-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多