CASE WHEN条件中使用子查询别名报ORA-00904无效标识符问题
问题说明
你遇到的两个报错分别是SQL语法规则和别名作用域限制导致的,具体问题如下:
- 第一个写法的语法错误原因:
AS 别名仅可用于SELECT子句的输出列定义、FROM子句的表/子查询重命名两个场景,你将别名定义放在CASE WHEN的条件判断表达式中间,不符合SQL语法规范,因此直接触发语法错误。 - 第二个写法的ORA-00904错误原因:子查询内部定义的
PQ_COUNT别名作用域仅局限于该子查询内部,该子查询作为标量表达式放在CASE WHEN的判断条件中时,外部的THEN分支无法跨作用域访问子查询内部的别名,因此会报标识符无效错误。
正确实现方案
可以提前将计数值计算好放到外层可见的位置,避免重复查询同时解决别名无法访问的问题,参考写法如下:
-- 方案1:将计数值作为前置计算列放在子查询中 SELECT CASE WHEN RESULTS LIKE '%PQ - Duplicate%' AND PQ_COUNT >= 1 THEN 'PQ count = ' || PQ_COUNT ELSE RESULTS END AS RESULTS FROM ( SELECT t.*, (SELECT COUNT(*) FROM MY_TABLE WHERE ID = '998877' AND FINAL_RESULTS = 'FL_57') AS PQ_COUNT FROM 你的原业务表名 t ) tmp
如果计数值是全局固定值,和原表行数据无关,也可以用CTE提前计算:
-- 方案2:用CTE提前计算全局计数值 WITH pq_cnt AS ( SELECT COUNT(*) AS PQ_COUNT FROM MY_TABLE WHERE ID = '998877' AND FINAL_RESULTS = 'FL_57' ) SELECT CASE WHEN t.RESULTS LIKE '%PQ - Duplicate%' AND c.PQ_COUNT >= 1 THEN 'PQ count = ' || c.PQ_COUNT ELSE t.RESULTS END AS RESULTS FROM 你的原业务表名 t, pq_cnt c
内容的提问来源于stack exchange,提问作者user2102665
相关产品推荐
相关产品推荐

