oracle - 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
我想知道是否有人可以告诉我如何修复我的查询以使查询正常运行?谢谢
解决方案
您的两个 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
了,但是感觉还是有点暧昧。
推荐阅读
- python-3.x - 无法使用 svglib 将 svg 转换为 png
- python - 通过保留原始布局将扫描图像写入 Word 文档
- c - 如何正确定义处理不透明指针的内联函数?
- r - 从另一个数据框向ggplot图例添加一个点
- github - 如何在 README.md 中插入幻灯片
- flutter - 如何近似颜色
- android - Nativescript tns 运行 android(应用程序未在设备上运行)
- xamarin - 平移手势导致闪烁问题
- regex - 在 PostgreSQL 11.0 中将浮点数限制为 2 位小数
- python - BeautifulSoup find_all() 正在返回空列表