对于每个“何时”条件,何时带有其他条件

时间:2018-08-26 07:23:00

标签: sql case impala

我有一张表格,其中日期格式不同。我试图在下面的查询中编写具有逻辑的查询,好像部门是A,并且如果日期等于2010年10月1日,则为null,否则请保持原始日期的格式更改。我正在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 

然后为null, 如果不是,则保留原始日期,格式更改为“ yyyy-MM-dd HH:mm:ss”。

麻烦是我的Case语句抛出错误。我可以使用Final Else语句正确运行所有情况,但是这里我需要为每个WHEN设置ELSE,因为日期格式不同。最后一个ELSE将使我的大多数日期格式无法识别,并给出NULL值。 纠正此案例陈述的任何输入都会有所帮助

1 个答案:

答案 0 :(得分:0)

假设此处使用布尔值lazy/short-circuit evaluation并假设从from_unixtime()函数引发了错误,那么您可以先检查unix_timestamp()的结果是否有效,然后再将结果传递到{{ 1}}可以避免该错误。

例如from_unixtime()