如何在雪花的案例陈述中使用 DATEADD?

How to use DATEADD in a case statement in snowflake?

我有一个 table,其列 PERIOD_DAYS 在 varchar 中,但包含很多数字。我还有一个名为 FIRST_DATETIME 的列,它是日期时间数据类型。我想将 PERIOD_DAYS 中的数字添加到 FIRST_DATETIME 以获得最终日期时间。因此,如果 datetime = '2020-01-01' + 2 DAYS,则 final_datetime 应该 = '2020-01-03'

我有一个包含 case 语句的查询,它表示如果 first_datetime 为 NULL,则将 final_datetime 默认为 0。但是,我一直收到错误消息。

这个有效:

select
ID,
PERIOD_DAYS,
FIRST_DATETIME,
DATEADD('days',try_to_number(PERIOD_DAYS), FIRST_DATETIME) as FINAL_DATETIME
from TBL_A a
group by ID,PERIOD_DAYS,FINAL_DATETIME

无效:

select
ID,
PERIOD_DAYS,
FIRST_DATETIME,
case when try_to_number(PERIOD_DAYS) IS NULL then 0 else DATEADD('days',try_to_number(PERIOD_DAYS), FIRST_DATETIME) END as FINAL_DATETIME
from TBL_A a
group by ID,PERIOD_DAYS,FINAL_DATETIME

我需要第二个查询来考虑 period_days 列中的非数字值。

您遇到的问题是因为您的 CASE 返回 0,它在一个分支上是一个 NUMBER,在另一个分支上是 TIMESTAMP_NTZ。

这些不是兼容的类型。我建议使用 NULL 而不是零。

因此:

CASE WHEN try_to_number(PERIOD_DAYS) IS NULL THEN null 
     ELSE DATEADD('days',try_to_number(PERIOD_DAYS), FIRST_DATETIME) 
END as FINAL_DATETIME

鉴于这只有 2 个分支,可以使用 IFF 代替:

IFF(try_to_number(PERIOD_DAYS) IS NULL, null, DATEADD('days',try_to_number(PERIOD_DAYS), FIRST_DATETIME) ) as FINAL_DATETIME