You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Databricks SQL CASE语句PARSE_SYNTAX_ERROR报错及结果实现

解决Databricks SQL语法错误并实现期望输出

原代码语法错误分析

  1. 第一个代码的问题:在CASE的WHEN条件中使用了返回多行的子查询(SELECT name FROM bop WHERE Id='1')。Databricks SQL要求标量上下文(如WHEN条件判断)中的子查询必须返回单行,而该子查询会返回两条记录(null和john),因此触发PARSE_SYNTAX_ERROR。

  2. 第二个代码的问题:在WHEN子句中错误使用WHERE关键字,WHERE只能用于过滤整表/结果集,不能嵌套在CASE的WHEN条件里。

实现期望输出(返回john)

根据你提供的表数据和期望结果,核心需求是获取ID='1'且name不为null的记录。以下提供两种实现方式:

方式1:直接筛选目标记录

如果仅需要返回john,最简单的写法是直接过滤条件:

SELECT name AS result
FROM bop
WHERE Id = '1' AND name IS NOT NULL;

方式2:结合条件判断的CASE实现

如果需要保留原CASE的逻辑框架(比如需要根据全局条件判断是否返回结果),可以先用子查询预校验全局条件,再结合筛选:

WITH global_checks AS (
  -- 预检查ID=1是否存在非null的name,ID=7是否存在非null的name
  SELECT
    EXISTS(SELECT 1 FROM bop WHERE Id='1' AND name IS NOT NULL) AS has_valid_id1,
    EXISTS(SELECT 1 FROM bop WHERE Id='7' AND name IS NOT NULL) AS has_valid_id7
)
SELECT
  CASE
    -- 原代码逻辑要求两个条件都为真,但原数据中ID=7无有效name,因此调整条件以匹配期望输出
    WHEN gc.has_valid_id1 AND NOT gc.has_valid_id7
    THEN b.name
    ELSE NULL
  END AS result
FROM bop b
CROSS JOIN global_checks gc
WHERE b.Id='1' AND b.name IS NOT NULL;

说明

原代码的逻辑是当ID='1'和ID='7'都存在非null的name时返回当前行的name,但你提供的表数据中ID='7'的name是null,因此原逻辑无法得到john。上述代码已根据你的期望结果调整了条件,确保返回目标值。

内容的提问来源于stack exchange,提问作者Alyssa

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 04:56:01