【问题标题】:CASE..WHEN condition not working in Oracle SqlCASE..WHEN 条件在 Oracle Sql 中不起作用
【发布时间】:2020-02-04 17:10:57
【问题描述】:

我在查询中有低于 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 返回 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';

【问题讨论】:

  • 正如预期的那样,因为该行的列值没有条件为真。

标签: sql oracle select case-when


【解决方案1】:

如果您不希望该值永远为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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多