Использование CASE в качестве условия соединения в Hive - PullRequest
0 голосов
/ 08 апреля 2020

Я пытаюсь выполнить запрос в Hive, где я запускаю объединение на основе оператора case. По какой-то причине у меня возникли проблемы со строками 7 и 8. Мне не удалось устранить ошибку, которая

, строка 7. Ожидаемое: AND, AS, МЕЖДУ, DIV, ILIKE, IN, IREGEXP , ЕСТЬ, КАК, НЕ, ИЛИ, REGEXP, RLIKE ПРИЧИНАЕТ: Исключение: Синтаксическая ошибка

строка 8: Обнаружено: как ожидается: И, МЕЖДУ, DIV, ILIKE, IN, IREGEXP, ЕСТЬ, КАК, НЕ , ИЛИ, REGEXP, RLIKE ПРИЧИНАЕТ: Исключение: синтаксическая ошибка

select * from dra_record_set.mark_set inv 
                        INNER JOIN innerdb.name_set roll_table
                        on inv.record_id = roll_table.ply_record_id AND
                        roll_table.date =
                            (CASE
                                WHEN inv.purchase_day>0 AND inv.purhcase_date BETWEEN roll_table.discount_start_dt AND roll_table.discount_end_dt) THEN inv.purchase_date
                                ELSE WHEN (CONCAT(inv.purchase_yr,inv.purchase_mo,(CAST("15")AS INT))) AS temp_var BETWEEN roll_table.discount_start_dt AND roll_table.discount_end_dt) THEN inv.purchase_date
                            END AS temp_pur_dt)
                        WHERE inv.inroll_discount_eligible_flag =1
                        limit 10

1 Ответ

1 голос
/ 08 апреля 2020

case является выражением . Возвращает значение. Похоже, вы больше похожи на макрос для замены SQL кода.

Удалите case и просто используйте логические логики c:

from dra_record_set.mark_set inv join
     innerdb.name_set roll_table
     on inv.record_id = roll_table.ply_record_id and
        ( (inv.purchase_day > 0 and
          inv.purhcase_date between roll_table.discount_start_dt and roll_table.discount_end_dt
          ) or
          (inv.purchase_day <= 0 and
           CONCAT(inv.purchase_yr, inv.purchase_mo, 15) between roll_table.discount_start_dt AND roll_table.discount_end_dt
          )
        )
...