ДЕЛО в КОАЛЕЦЕ - PullRequest
       8

ДЕЛО в КОАЛЕЦЕ

0 голосов
/ 14 сентября 2018

У меня есть две таблицы Redshift со значениями меток времени. У одного из них есть local с некоторыми нулями, а у другого - 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)

Но я получаю ошибку. Запрос довольно большой, поэтому я хочу избежать временных таблиц. Любое решение? Заранее спасибо

Ответы [ 3 ]

0 голосов
/ 14 сентября 2018

Я не думаю, что вам нужно использовать здесь coalesce, вы можете просто добавить случай, когда local_time не равно нулю:

          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 голосов
/ 14 сентября 2018

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

См. Также документацию Redshifts по Выражение COALESCE / NVL

0 голосов
/ 14 сентября 2018

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
...