Oracle:在UNPIVOT查询中添加表中不存在的CAR_DAY列
解决方法
你的UNPIVOT语法用错了,Oracle不支持直接在IN子句里把列和常量配对。给你两种可行的写法:
方法一:用UNION ALL(简单直观)
适合列数不多的场景,把每一列拆成单独查询再合并:
SELECT ID, CAR_1 AS CAR_ID, 1 AS CAR_DAY FROM CARS UNION ALL SELECT ID, CAR_2 AS CAR_ID, 2 AS CAR_DAY FROM CARS UNION ALL SELECT ID, CAR_3 AS CAR_ID, 3 AS CAR_DAY FROM CARS -- 可选:添加WHERE子句过滤空值,比如 WHERE CAR_1 IS NOT NULL(对应每个分支)
方法二:用正确的UNPIVOT语法
先将CAR_1/CAR_2/CAR_3转成键值对,再从列名里提取数字作为CAR_DAY:
SELECT ID, CAR_ID, TO_NUMBER(SUBSTR(CAR_COL, 4)) AS CAR_DAY FROM CARS UNPIVOT ( CAR_ID FOR CAR_COL IN (CAR_1, CAR_2, CAR_3) )
这里SUBSTR(CAR_COL,4)是从CAR_1这类列名里截取第4位开始的数字部分,再转成数值类型。
示例数据验证
用你提供的测试数据验证方法二,完整语句如下:
WITH CARS AS ( SELECT 1 as ID, 100 as CAR_1, 200 as CAR_2, 300 as CAR_3 from dual ) SELECT ID, CAR_ID, TO_NUMBER(SUBSTR(CAR_COL, 4)) AS CAR_DAY FROM CARS UNPIVOT ( CAR_ID FOR CAR_COL IN (CAR_1, CAR_2, CAR_3) )
执行后就能得到你想要的结果。
原语句的问题在于:Oracle的UNPIVOT多列转换要求配对的是现有列(比如同时有CAR_1和DAY_1列),而不是列和常量组合,所以你原来的写法不符合语法规范。
内容的提问来源于stack exchange,提问作者user_odoo
相关产品推荐
相关产品推荐

