我有两个带时间戳值的Redshift表。其中一个有局部有一些空值而另一个有GMT但没有空值。我在表2中也有一个国家/地区列。我想查询本地时间值,并根据国家/地区使用COALESCE和CASE作为空值。我试过了
CASE
WHEN (T1.local_time = '' OR T1.local_time=NULL) AND T2.country = 'UK' THEN T2.gmt_time
WHEN (T1.local_time = '' OR T1.local_time=NULL) AND T2.country = 'ES' DATEADD(hour, 1, T2.gmt_time)
...
ELSE T2.gmt_time END AS final_time
但它没有捕获空值。 COALESCE(NVL)允许我捕获NULL值,但我不确定在何处放置案例。我试过了:
COALESCE (T1.local_time,
CASE
WHEN T2.country = 'UK' THEN DA
WHEN T2.COUNTRY = 'SP' THEN DATEADD(hour, 1, T2.gmt_time)
...
ELSE T2.gmt_time END AS local_time)
AS time_final)
但我收到错误。查询非常大,因此我想避免临时表。任何解决方法?提前致谢
Null
不是一个价值,它缺乏价值。您无法使用=
运算符(检查两个值相等)来评估它,但必须使用is
运算符:
CASE
WHEN (T1.local_time = '' OR T1.local_time IS NULL) AND T2.country = 'UK'
THEN T2.gmt_time
WHEN (T1.local_time = '' OR T1.local_time IS NULL) AND T2.country = 'ES'
THEN DATEADD(hour, 1, T2.gmt_time)
...
ELSE T2.gmt_time
END AS final_time
我不认为你需要在这里使用coalesce,你可以在local_time不为null时添加大小写:
CASE
WHEN T1.local_time IS NOT NULL AND T1.local_time != '' THEN T1.local_time
WHEN T2.country = 'UK' THEN DA
WHEN T2.COUNTRY = 'SP' THEN DATEADD(hour, 1, T2.gmt_time)
...
ELSE T2.gmt_time END AS local_time)
COALESCE
将返回第一个不是NULL
的值。
在这种情况下,这将是以下。
CASE
WHEN (COALESCE(T1.local_time, '') = '') AND T2.country = 'UK' THEN T2.gmt_time
WHEN (COALESCE(T1.local_time, '') = '') AND T2.country = 'ES' THEN DATEADD(hour, 1, T2.gmt_time)
...
ELSE T2.gmt_time END AS final_time
另请参阅有关COALESCE/NVL Expression的Redshifts文档