COALESCE中的案例

问题描述 投票:2回答:3

我有两个带时间戳值的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)

但我收到错误。查询非常大,因此我想避免临时表。任何解决方法?提前致谢

sql amazon-redshift coalesce
3个回答
0
投票

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

0
投票

我不认为你需要在这里使用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) 

0
投票

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文档

© www.soinside.com 2019 - 2024. All rights reserved.