使用case语句进行oracle查询时出现问题

使用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

我有一个物化视图表,其中包含有关员工及其对系统访问权限的信息 该表有“生效日期”列和“生效日期”列。该物化视图每天晚上更新一次

我想在此表中添加一个额外的列“current_flag”,以显示当前员工是否具有“Y”或“N”访问权限。 我正在考虑使用“案例”陈述,类似于以下内容:-

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
       );