sql - 每个 'When' 条件的 case when with else
问题描述
我有一张日期格式不同的表格。我正在尝试在下面编写查询,其逻辑好像部门是 A,如果日期等于 2010 年 10 月 1 日,则为空,否则保留原始日期并更改格式。我在 Impala 中执行它。有多种日期格式,例如:
M/d/yyyy
MM/d/yyyy
dd-MM-yyyy
ETC
我的查询是这样的。
select
CASE WHEN y.dept='MDM'
CASE WHEN
a.date=from_unixtime(unix_timestamp(a.date,'M/d/yyyy'),'M/d/yyyy')
AND from_unixtime(unix_timestamp(a.date,
'M/d/yyyy'),'yyyy-MM-dd HH:mm:ss') ='10-01-2010 00:00:00' THEN null
ELSE from_unixtime(unix_timestamp(a.date,
'M/d/yyyy'),'yyyy-MM-dd HH:mm:ss')
else
WHEN a.date=from_unixtime(unix_timestamp(a.date,
'MM/dd/yyyy'),'MM/dd/yyyy')
AND from_unixtime(unix_timestamp(a.date, 'MM/dd/yyyy'),'yyyy-MM-dd
HH:mm:ss') ='10-01-2010 00:00:00' THEN null
ELSE from_unixtime(unix_timestamp(a.date, 'MM/dd/yyyy'),'yyyy-MM-dd
HH:mm:ss')
End
Case WHEN a.date=from_unixtime(unix_timestamp(a.date,
'M/dd/yyyy'),'M/dd/yyyy')
AND from_unixtime(unix_timestamp(a.date, 'M/dd/yyyy'),'yyyy-MM-dd
HH:mm:ss') ='10-01-2010 00:00:00' THEN null
ELSE from_unixtime(unix_timestamp(a.date, 'M/dd/yyyy'),'yyyy-MM-dd
HH:mm:ss') End End
FROM Table INNER JOIN Table Y
ON y.id=a.id WHERE y.dept='MDM'
我正在比较 A.date 的日期格式 - 如果匹配
from_unixtime(unix_timestamp(a.date,'M/d/yyyy'),'M/d/yyyy')
和
from_unixtime(unix_timestamp(a.date, 'M/d/yyyy'),'yyyy-MM-dd HH:mm:ss') matches 1-Oct-2010
然后为 null ,如果不是,则保留原始日期,格式更改为 'yyyy-MM-dd HH:mm:ss'。
问题是我的 Case 语句抛出错误。我可以正确地使用 Final Else 语句运行所有 case When's,但在这里我需要为每个 WHEN 设置一个 ELSE,因为我的日期格式不同。最后的单个 ELSE 会使我的大多数日期格式无法识别并给出 NULL 值。纠正此案例陈述的任何输入都会有所帮助
解决方案
假设这里适用布尔惰性/短路评估并假设从from_unixtime()
函数中抛出错误,您可以先检查结果unix_timestamp()
是否有效,然后再将结果传递给以from_unixtime()
避免错误。
例如CASE WHEN unix_timestamp(a.date,'M/d/yyyy') > 0 AND a.date=from_unixtime(unix_timestamp(a.date,'M/d/yyyy'),'M/d/yyyy') ...