【 TiDB 使用环境】生产环境
【 TiDB 版本】v6.5.1
【复现路径】使用视图库的表的时候嵌套case when会报错
【遇到的问题:问题现象及影响】
【资源配置】跟配置无关
【附件:截图/日志/监控】
【 TiDB 使用环境】生产环境
【 TiDB 版本】v6.5.1
【复现路径】使用视图库的表的时候嵌套case when会报错
【遇到的问题:问题现象及影响】
【资源配置】跟配置无关
【附件:截图/日志/监控】
错误码 1105 表示在 schema column 中找不到指定的列。因此,你的报错信息 “错误 1105” 可能是由于视图中的查询涉及到多个 CTE,TiDB 分别会在 buildTableRef
和 BuildSelectSubq
两个过程中克隆 schema column 信息并赋予一个 hashcode (用于在投影消除阶段时父列和子列的关系映射)。由于使用了过期的 hashcode 这将导致关联条件列会被错误映射。
如果你的 SQL 中使用了嵌套的 CASE WHEN
,可能会导致 TiDB 在执行时无法正确识别列名,从而报错 1105。这可能是因为 TiDB 在处理 CASE WHEN
语句时会生成一个临时列名,而这个列名可能与你的视图中的列名冲突,导致 TiDB 找不到指定的列。
为了解决这个问题,你可以尝试使用别名来避免列名冲突。例如,将 CASE WHEN
语句中的临时列名改为一个不会与视图中的列名冲突的名称,如下所示:
SELECT
v1.id,
v1.name,
CASE
WHEN v1.age > 18 THEN '成年人'
ELSE '未成年人'
END AS age_group
FROM my_view v1;
在这个例子中,我们将 CASE WHEN
语句中的临时列名改为 age_group
as ‘B1’ 换成 as B1 试试
依然报错
用case 字段 when 字段判断 then 结果1 else 结果2 end 的原发试试
你单独执行ifnull那一串能执行吗?
SELECT ISNULL(MAX(CASE WHEN 1=1 THEN (CASE WHEN a.i_re >0 THEN ‘1’ ELSE ‘0’ END)
ELSE ‘0’ END ),0) FROM a;
我直接这样执行都报错了,报
Incorrect parameter count in the call to native function ‘isnull’
已解决原因是max使用不对,跟tidb没有关系,谢谢大佬们
此话题已在最后回复的 60 天后被自动关闭。不再允许新回复。