首页 > 解决方案 > Oracle 错误:NULL 列:表达式必须具有与相应表达式相同的数据类型 -

问题描述

我正在尝试将两个表附加在一起,它们没有完全相同的列,但包含相同客户端的数据。"结果"表包含1个月内收集的客户调查结果,"检查点"表包含6个月后收集的客户调查结果。我尝试附加这两个表,并通过引入 NULL 列来确保列数相同,以便两个表中的列数匹配这是我的查询:

tbl_out AS (
SELECT 
PRG_NAME,
CASEREFERENCE,
STARTDATE,
STATUS,
ENDDATE,
LASTWRITTEN,
CLOSURE_REASON,
--these columns were made to match the tbl_check table--
TO_CHAR(NULL) AS Reviewer,
TO_DATE(NULL) AS Month_Schedule_Date, 
TO_CHAR(NULL) AS Month_REASON, 
TO_DATE(NULL) AS Month_Start_Date, 
TO_DATE(NULL) AS Month_End_Date, 
TO_CHAR(NULL) AS MONTH_Resubmit_MILESTONE, 
TO_CHAR(NULL) AS MONTH_MILESTONE_ACHIEVED, 
TO_DATE(NULL) AS MONTH_APPROVED_DATE, 
--at 1 month--
OUTCOME_DATE, 
Outcome_Reference_ID, 
Outcome_EMP_SITUATION, 
Outcome_Work_Job_Business,  
Outcome_Employment_Type, 
Outcome_NUM_JOBS,  
Outcome_NAICS,
Outcome_NAICS_Desc,
Outcome_NOC,
Outcome_NOC_Desc,
Outcome_JOB_Nature,
TO_NUMBER(Outcome_WORK_HOURS),  
TO_NUMBER(Outcome_WAGE),  
Outcome_Change_Employment,
TO_NUMBER(Outcome_NUM_EMP_Change),
Outcome_LAST_UNEMP_DATE,
Outcome_Attend_School, 
Outcome_STUDENT_STATUS,
Outcome_STUDENT_Type,
Outcome_EMP_CATEGORIES,
Outcome_Got_Service,
Outcome_Right_Service,
Outcome_Seek_Help_Again,
Outcome_Recommend_Program,
Outcome_Didnot_Seek_Employment
FROM outcome 
),
tbl_check AS (
SELECT 
PRG_NAME,
CASEREFERENCE,
STARTDATE,
STATUS,
ENDDATE,
LASTWRITTEN,
CLOSURE_REASON,
--info from tbl_out--
TO_DATE(NULL) AS OUTCOME_DATE,  
--at 6 months--
TO_CHAR(Reviewer), 
TO_DATE(Month_Schedule_Date), 
TO_CHAR(Month_REASON), 
TO_DATE(Month_Start_Date), 
TO_DATE(Month_End_Date), 
month_Review_Reference_ID, 
month_outcome AS MONTH_EMP_SITUATION, 
Month_Work_Job_Business, 
Month_Outcome_Employment_Type, 
month_NUM_JOBS,
month_NAICS, 
Month_NAICS_Desc,
MONTH_NOC,
Month_NOC_Desc,
Month_JOB_Nature,
TO_NUMBER(MONTH_WORK_HOURS),
TO_NUMBER(MONTH_WAGE),
Month_Change_Employment,
TO_NUMBER(Month_NUM_EMP_Change),
MONTH_LAST_UNEMP_DATE,
Month_Attend_School,
Month_STUDENT_STATUS,
Month_STUDENT_Type,
Month_EMP_CATEGORIES,
Month_Got_Service,
Month_Right_Service,
Month_Seek_Help_Again,
Month_Recommend_Program,
Month_Didnot_Seek_Employment,
TO_CHAR(MONTH_Resubmit_MILESTONE), 
TO_CHAR(MONTH_MILESTONE_ACHIEVED), 
TO_DATE(MONTH_APPROVED_DATE) 
FROM checkpoint 
)
SELECT * FROM tbl_out
UNION 
SELECT * FROM tbl_check

但是,我仍然收到此错误: 在此处输入图像描述

我想知道是否有人可以告诉我如何修复我的查询以使查询正常运行?谢谢

标签: oracle

解决方案


您的两个 CTE 中的列的顺序不同。例如,在第一个 CTEReviewer中是第 8 列,但在第二个 CTE 中是第 9 列。这导致不同的数据类型处于匹配位置,而不仅仅是看起来不匹配的数据。

当你这样做时:

SELECT * FROM ...

投影的列按 CTE 中定义的顺序排列;例如,它不会根据名称自动对它们重新排序;名称不需要相同(并且对于您的许多列来说它们都不相同)。

重新排列一个或两个 CTE 中的列,使其正确对齐。或者列出每个选择列表中的列而不是使用*,但在这种情况下,这可能没有帮助。通常避免*,但有时它是一个有效且明智的选择。

这与空值无关,除了您可能将它们放在错误的位置。


顺便说一句,真的,有点个人,而不是做这样的事情:

TO_CHAR(NULL) AS Reviewer,
TO_DATE(NULL) AS Month_Schedule_Date, 

我通常会转换为正确的数据类型:

CAST(NULL AS VARCHAR2(30)) AS Reviewer,
CAST(NULL AS DATE) AS Month_Schedule_Date,

等等,匹配目标数据类型——为了清楚起见,包括字符串长度和数字比例/精度。这在某种程度上是一个品味问题。但是有四个版本to_char(),都返回varchar2了,但是感觉还是有点暧昧。


推荐阅读