case when与else for every'when'条件

imzjd6km  于 2021-06-26  发布在  Impala
关注(0)|答案(1)|浏览(427)

我有一张不同日期格式的table。我试图写下面的查询,它的逻辑好像部门是一个,如果日期等于2010年10月1日,它是空的,否则保持格式更改的原始日期。我在 Impala 里执行。有多种日期格式,如:

M/d/yyyy
MM/d/yyyy
dd-MM-yyyy


我的问题是这样的。

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

则为空,如果不是,则保留原始日期,格式更改为“yyyy-mm-dd hh:mm:ss”。
问题是我的陈述有错误。我可以用else语句正确地运行所有case when's,但是这里我需要一个else for every when,因为我的日期格式不同。最后一个else将导致大多数日期格式无法识别,并给出空值。任何输入都将有助于更正此case语句

slmsl1lt

slmsl1lt1#

假设布尔延迟/短路计算在这里适用,并且假设错误是从 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') ...

相关问题