【问题标题】:Oracle SQL: Case Statement in where clause returns an error "single-row subquery returns more than one row"Oracle SQL:where子句中的Case Statement返回错误“单行子查询返回多行”
【发布时间】:2016-10-25 07:43:20
【问题描述】:

这是一个带有 CASE 条件语句的选择查询的 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: 单行子查询返回多于一行

  1. 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; 

【问题讨论】:

  • CASE 语句只能返回一个标量(单个值)。解决方案是更改子查询以返回单行。您能否包含完整的查询,以便我们查看整个逻辑?
  • @TimBiegeleisen 谢谢。但是如何获得日期列表作为回报呢?或者有没有其他方法可以满足要求,不使用CASE?
  • 这是一个案例表达式。 (case 表达式返回一个值。case 语句(例如在存储过程中)只是代码的条件执行。)

标签: sql oracle select case where-clause


【解决方案1】:

尝试以下解决方案。

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 之后的查询将仅在星期五运行。只有查询会返回结果。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-12
    • 1970-01-01
    • 2020-12-20
    • 1970-01-01
    相关资源
    最近更新 更多