首页 > 解决方案 > CASE..WHEN 条件在 Oracle Sql 中不起作用

问题描述

case when在查询中有以下条件,但并没有得到某种满足。

我想case whenselect查询中编写逻辑,以便当LAST_TRADEABLE_DT不为空时取LAST_TRADEABLE_DT,当LAST_TRADEABLE_DT为空时应满足以下条件:

WHEN t.opt_exer_typ = 'American'
            AND  t.mic_exch_code = 'XDMI'
            THEN t.opt_expire_dt - 1
            WHEN t.opt_exer_typ != 'American' 
            THEN t.opt_expire_dt 

我已经写了下面的查询,但我得到last_tradedate了空值。我从不想last_tradedate返回 null。

  SELECT
    t.opt_exer_typ,
    t.mic_exch_code,
    t.ID_BB_GLOBAL,    
    t.LAST_TRADEABLE_DT,    
    t.OPT_EXER_TYP,
    (
        CASE 
            WHEN t.LAST_TRADEABLE_DT is not null  
            THEN t.LAST_TRADEABLE_DT                     
            WHEN t.LAST_TRADEABLE_DT IS NULL 
            AND  t.opt_exer_typ = 'American'
            AND  t.mic_exch_code = 'XDMI'
            THEN t.opt_expire_dt - 1
            WHEN t.LAST_TRADEABLE_DT IS NULL 
            AND  t.opt_exer_typ != 'American' 
            THEN t.opt_expire_dt  
        END) last_tradedate,
    t.OPT_EXPIRE_DT
FROM
    TEST_AGG t where t.ID_BB_GLOBAL = 'XXX1234';

标签: sqloracleselectcase-when

解决方案


如果您不希望该值永远存在NULL,请使用ELSE. 我想你想要:

 (CASE WHEN t.LAST_TRADEABLE_DT is not null  
       THEN t.LAST_TRADEABLE_DT                     
       WHEN t.opt_exer_typ = 'American' AND
            t.mic_exch_code = 'XDMI'
       THEN t.opt_expire_dt - 1
       ELSE t.opt_expire_dt  
  END) last_tradedate,

我不是 100% 确定这是你想要的逻辑。您的代码将NULL在以下情况下返回值:

  • opt_exer_typ = 'American' and mic_exch_code <> XDMI
  • opt_exer_typ = 'American' and mic_exch_code IS NULL
  • opt_exer_typ IS NULL

(假设不满足第一个条件)。


推荐阅读