CASE..WHEN 条件在 Oracle Sql 中不起作用

CASE..WHEN condition not working in Oracle Sql

我在查询中有以下 case when 条件,但不知何故无法满足。

我想在 select 查询中的 case when 中编写逻辑,这样当 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 到 return 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';

如果您不希望该值永远是 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% 确定这就是您想要的逻辑。在以下情况下,您的代码将 return 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

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