使用case语句进行oracle查询时出现问题
我有一个物化视图表,其中包含有关员工及其对系统访问权限的信息 该表有“生效日期”列和“生效日期”列。该物化视图每天晚上更新一次 我想在此表中添加一个额外的列“current_flag”,以显示当前员工是否具有“Y”或“N”访问权限。 我正在考虑使用“案例”陈述,类似于以下内容:-使用case语句进行oracle查询时出现问题,oracle,case,Oracle,Case,我有一个物化视图表,其中包含有关员工及其对系统访问权限的信息 该表有“生效日期”列和“生效日期”列。该物化视图每天晚上更新一次 我想在此表中添加一个额外的列“current_flag”,以显示当前员工是否具有“Y”或“N”访问权限。 我正在考虑使用“案例”陈述,类似于以下内容:- CASE WHEN to_date(c.effective_date) < to_date(sysdate) and to_date (effective_date_to) > to_date
CASE WHEN to_date(c.effective_date) < to_date(sysdate)
and to_date (effective_date_to) > to_date(sysdate)
THEN 'Y'
ELSE 'N'
END) AS current_flag
除了您的额外括号和错误的
to_Date()
之外,我认为它是有效的
i、 你试过这个吗
CREATE MATERIALIZED VIEW TC.employee_access
(
EMPL_ID,
EFFECTIVE_DATE,
EFFECTIVE_DATE_TO,
DEPARTMENT,
JOB_DESCRIPTION,
TIME_STAMP,
MODIFIED_BY,
current_flag
)
...
WITH PRIMARY KEY
AS
SELECT C.EMPL_ID AS Empl_Id,
C.EFFECTIVE_DT AS Effective_Date,
DECODE (n.effective_dt,
c.effective_dt, TO_DATE ('01/01/2099', 'DD/MM/YYYY'),
n.effective_dt - 1)
AS Effective_Date_To,
C.DFLT_UDT06_ID AS Department,
C.DFLT_UDT08_ID AS Job_Description,
C.TIME_STAMP,
C.MODIFIED_BY,
CASE WHEN c.effective_date < sysdate
and effective_date_to > sysdate
THEN 'Y'
ELSE 'N'
END as current_flag
FROM empl_history_mv c, empl_history_mv n
....
创建物化视图TC.employee\u访问
(
雇员身份证,
生效日期:,
生效日期至,
部门
工作描述,
时间戳,
修改为,
当前_标志
)
...
带主键
作为
选择C.emp\u ID作为emp\u ID,
C.生效日期为生效日期,
解码(n.effective_dt,
c、 生效日期,截止日期(“2099年1月1日”,“年/月/日”),
n、 有效剂量(dt-1)
自年月日起生效,
C.DFLT_UDT06_ID作为部门,
C.DFLT\U UDT08\U ID作为工作描述,
时间戳,
C.由,
c.生效日期<系统日期时的情况
和生效日期至>系统日期
然后是“Y”
否则
结束为当前_标志
来自员工历史记录c,员工历史记录n
....
案例-语句需要访问您的计算值生效日期至
。您可以使用一组附加的括号来执行此操作:
SELECT empl_id,
effective_date,
effective_date_to,
CASE WHEN effective_date < SYSDATE AND SYSDATE < effective_date_to
THEN 'Y' ELSE 'N' END current_flag
FROM (
SELECT c.empl_id
c.effective_dt as effective_date,
FROM ...
);
选择雇员id,
生效日期:,
生效日期至,
生效日期<系统日期和系统日期<生效日期
然后是“Y”ELSE“N”END current_标志
从(
选择c.emp\u id
c、 生效日期为生效日期,
从…起
);
或者将逻辑展开到一个查询中:
SELECT c.empl_id,
c.effective_dt as effective_date,
NVL2(n.effective_dt, n.effective_dt - 1, DATE'2099-01-01') AS effective_date_to,
CASE WHEN c.effective_dt <= sysdate
AND (sysdate < n.effective_dt OR n.effective_dt IS NULL)
THEN 'Y' ELSE 'N' END AS current_flag
FROM empl_history_mv c
LEFT JOIN empl_history_mv n
ON c.empl_id = n.empl_id
AND c.effective_dt < n.effective_dt
AND NOT EXISTS (
SELECT *
FROM empl_history_mv t
WHERE c.empl_id = t.empl_id
AND c.effective_dt < t.effective_dt
AND t.effective_dt < n.effective_dt
);
选择c.emp\u id,
c、 生效日期为生效日期,
NVL2(n.生效日期,n.生效日期-1,日期'2099-01-01')作为生效日期至,
当c.effective\u dt sysdate类型为Date,并且您不必执行to\u Date(sysdate)操作时,您会遇到什么错误?请发布ORA错误消息。在已经是日期的列上使用to\u Date()
绝对没有用(更不用说毫无意义)。
SELECT c.empl_id,
c.effective_dt as effective_date,
NVL2(n.effective_dt, n.effective_dt - 1, DATE'2099-01-01') AS effective_date_to,
CASE WHEN c.effective_dt <= sysdate
AND (sysdate < n.effective_dt OR n.effective_dt IS NULL)
THEN 'Y' ELSE 'N' END AS current_flag
FROM empl_history_mv c
LEFT JOIN empl_history_mv n
ON c.empl_id = n.empl_id
AND c.effective_dt < n.effective_dt
AND NOT EXISTS (
SELECT *
FROM empl_history_mv t
WHERE c.empl_id = t.empl_id
AND c.effective_dt < t.effective_dt
AND t.effective_dt < n.effective_dt
);