【问题标题】:Syntax Error While Using Case Statement in Spark SQL在 Spark SQL 中使用 case 语句时出现语法错误
【发布时间】:2016-09-28 19:32:31
【问题描述】:

我想运行一个 case 语句,该语句根据 Spark SQL 中的条件运行不同的 SELECT 语句,但无法获得正确的语法。

我的SQL语句是这样的

registerTable(sql="SELECT CASE WHEN typedKeyword > '' THEN (SELECT * FROM `temp.sdf0` WHERE  originalKeyword > ''AND  keyword > '' AND deviceType = 'devicetype' ) ELSE (SELECT * FROM `temp.tes` WHERE  originalKeyword > ''AND  keyword > '' ) END  ",alias="temp.test")

我不知道 spark SQL 是否支持 CASE 语句,那么如何实现这一点

【问题讨论】:

  • 您不能将完整的选择放入 CASE
  • 您应该在逻辑中处理它并根据输入执行 2 个不同的查询
  • 谢谢。如果可能的话只是感兴趣
  • 或者解决这个问题的最佳方法是创建一个存储过程来处理 SQL 中不支持的 2 个不同的查询。

标签: mysql apache-spark apache-spark-sql


【解决方案1】:

我使用过近十几种 SQL 和类似 SQL 的方言,但我从未见过这样的语法。看起来对 SQL 子句应该做什么存在核心误解。

SELECT 子句用于描述标量元素的投影。在许多方言中,您可以在此子句中发出子查询 - 有时甚至是相关子查询,但您始终必须应用将结果转换为标量值的运算符。例如:

SELECT (CASE WHEN EXISTS (SELECT foo FROM tbl) THEN 1 ELSE 0 END)

这里的“EXISTS”运算符将不相关的子查询转换为标量布尔值,因此是合法的。

顶级查询中缺少 FROM 子句也是一个很大的危险信号。它,或者像 Oracle 的“双重”这样的类似物,在我见过的大约一半的方言中是合法的,但如果你试图在两个查询之间动态切换,那么你几乎肯定做错了。 juergen 是对的 - 您可能打算使用 2 个不同的查询。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-15
    相关资源
    最近更新 更多