Databricks SQL CASE语句PARSE_SYNTAX_ERROR报错及结果实现
解决Databricks SQL语法错误并实现期望输出
原代码语法错误分析
第一个代码的问题:在
CASE的WHEN条件中使用了返回多行的子查询(SELECT name FROM bop WHERE Id='1')。Databricks SQL要求标量上下文(如WHEN条件判断)中的子查询必须返回单行,而该子查询会返回两条记录(null和john),因此触发PARSE_SYNTAX_ERROR。第二个代码的问题:在
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
相关产品推荐
相关产品推荐

