sql - CASE..WHEN 条件在 Oracle Sql 中不起作用
问题描述
我case when
在查询中有以下条件,但并没有得到某种满足。
我想case when
在select
查询中编写逻辑,以便当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';
解决方案
如果您不希望该值永远存在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
(假设不满足第一个条件)。
推荐阅读
- frequency - RuntimeWarning:遇到无效值
- scala - 使用 FoldLeft/Right 删除重复序列
- django - Django ListView如何用另一个上下文压缩上下文数据
- kdb - 如何根据我在 kdb 中的时间列删除表中的前几行
- python - 用字符串数据重塑数据框熊猫 - 没有类似的答案
- ffmpeg - 请问如何将这些 Blender 视频设置转换为 ffmpeg?
- xamarin - 如何从另一个页面将数据从 BindingContext 添加到 CollectionView
- oracle - Oracle 平均数
- rust - 缓存 sqlx 池导致文件句柄溢出
- ruby-on-rails - Ruby on Rails - Dhalang PDF 无法使用 localhost URL