【问题标题】:Case when with else for every 'When' condition每个 'When' 条件的 case when with else
【发布时间】:2019-02-01 02:12:55
【问题描述】:

我有一张日期格式不同的表格。我正在尝试在下面编写查询,其逻辑好像部门是 A,如果日期等于 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”。

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

【问题讨论】:

  • “我的查询是这样的。” - 不,不是。这充满了语法错误。
  • 另外,它没有任何意义。 a.date = from_unixtime(unix_timestamp(a.date,'M/d/yyyy'),'M/d/yyyy') 怎么可能不是真实的?我的意思是,您将a.date本身进行比较,您期望什么?此外,当同一个查询包含WHERE y.dept='MDM' 时,CASE WHEN y.dept='MDM' 的意义何在?

标签: sql case impala


【解决方案1】:

假设 boolean lazy/short-circuit evaluation 在这里适用,并假设错误是从 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') ...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-03-15
    • 1970-01-01
    • 1970-01-01
    • 2021-11-04
    • 2015-11-02
    • 1970-01-01
    • 2019-03-27
    相关资源
    最近更新 更多