Oracle SQL:where 子句中的 Case 语句 returns 出错 "single-row subquery returns more than one row"
Oracle SQL: Case Statement in where clause returns an error "single-row subquery returns more than one row"
这是一个带有 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: single-row subquery returns more than one row
- 00000 - "single-row subquery returns more than one row"
请帮我解决这个错误。
完整的查询供您参考:
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;
尝试以下解决方案。
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'
如果不是星期五,第一个查询将 运行。如果是星期五,则不会 return 任何结果。 UNION ALL 之后的查询将仅在星期五 运行。只有查询 return 个结果。
这是一个带有 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: single-row subquery returns more than one row
- 00000 - "single-row subquery returns more than one row"
请帮我解决这个错误。
完整的查询供您参考:
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;
尝试以下解决方案。
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'
如果不是星期五,第一个查询将 运行。如果是星期五,则不会 return 任何结果。 UNION ALL 之后的查询将仅在星期五 运行。只有查询 return 个结果。