【问题标题】:Using CASE as a join condition in Hive在 Hive 中使用 CASE 作为连接条件
【发布时间】:2020-07-20 07:10:03
【问题描述】:

我正在尝试在 Hive 中运行一个查询,并在其中运行基于 case 语句的连接。出于某种原因,我在第 7 行和第 8 行遇到了问题。我无法解决错误

第 7 行:预期:AND、AS、BETWEEN、DIV、ILIKE、IN、IREGEXP、IS、LIKE、NOT、OR、REGEXP、RLIKE 原因:异常:语法错误

第 8 行:遇到:如预期的那样:AND、BETWEEN、DIV、ILIKE、IN、IREGEXP、IS、LIKE、NOT、OR、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

【问题讨论】:

  • 请解释您要做什么。无效的查询很少有帮助。

标签: sql apache-spark hadoop hive


【解决方案1】:

case 是一个表达式。它返回一个值。您似乎更像是 SQL 代码的宏替换。

删除case,只使用布尔逻辑:

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

【讨论】:

  • 我们需要检查 roll_table.date 是否符合第二个条件和两个中间值。你在这里错过了......
  • @algorythms 。 . .这是我对第二个条件可能意味着什么的最佳猜测——代码没有意义。但无论逻辑是什么,同样的想法仍然成立。
猜你喜欢
  • 2019-06-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-23
相关资源
最近更新 更多