首页 文章

Oracle SQL:where子句中的Case语句返回错误“单行子查询返回多行”

提问于
浏览
1

这是一个带有CASE条件语句的select查询的where子句 . 我写这篇文章是为了满足以下要求:“如果是任何工作日,结果将包含第二天的日期,如果是星期五,结果将包括星期六,星期日和星期一的日期”

where DTTM IN (case 
                      when to_char(sysdate,'day') <> 'friday   ' then to_date(sysdate+1,'DD/MON/YY')
                      else (select to_date(sysdate+1,'DD/MM/YYYY') + level - 1 ddate
                            from dual
                            connect by level <= to_date(sysdate+4,'DD/MM/YYYY') - to_date(sysdate+1,'DD/MM/YYYY')
                            )
                end)

我也使用了 IN ,但是我收到了一个错误

ORA-01427:单行子查询返回多行00000 - “单行子查询返回多行”

请帮我解决这个错误 .

以下是供您参考的完整查询:

select * from orders 
      where DTTM IN (case 
                                when to_char(sysdate,'day') <> 'friday   ' then to_date(sysdate+1,'DD/MON/YY')
                                else (select to_date(sysdate+1,'DD/MM/YYYY') + level - 1 ddate
                                      from dual
                                      connect by level <= to_date(sysdate+4,'DD/MM/YYYY') - to_date(sysdate+1,'DD/MM/YYYY')
                                      )
                                end) 
      order by  DTTM;

1 回答

  • 0

    尝试以下解决方案 .

    SELECT * FROM orders 
    WHERE dttm = to_date(SYSDATE+1,'DD/MON/YY')
    AND TO_CHAR(SYSDATE,'day') <> 'friday'
    UNION ALL
    SELECT * FROM orders 
    where dttm IN (SELECT TO_DATE(SYSDATE+1,'DD/MM/YYYY') + level - 1 ddate
                   FROM dual
                   CONNECT BY LEVEL <= to_date(sysdate+4,'DD/MM/YYYY') - to_date(sysdate+1,'DD/MM/YYYY')
                   )
    AND to_char(sysdate,'day') = 'friday'
    

    第一个查询将在不是星期五的情况下运行 . 如果是星期五那么它将不会返回任何结果 . UNION ALL之后的查询仅在星期五运行 . 只有查询才会返回结果 .

相关问题