I have a problem with NVL function in oracle. If I send periods variable as null it is working.There is no data in query.I mean NVL function is working properly. If I send periods variable as for example 10 , it gives error like that
x
single-row-subquery-returns-more-than-one
This code block does not work because select query returns more than one row
Select . FROM students st, orders od
WHERE st.id IN NVL((select id from students
where student_id = 321
ORDER BY id desc
FETCH FIRST periods ROWS ONLY),(od.countNo))
I tried to use case when in where block but I cannot use it.Do you have any idea?
Advertisement
Answer
You would get the same error if you changed IN
to =
. IN
can handle sets of multiple rows from a subquery, but NVL()
and =
cannot.
If you INSIST on using NVL, change your subquery to return AT MOST 1 row:
-- using periods=1
Select . FROM students st, orders od
WHERE st.id = NVL((select id from students
where student_id = 321
ORDER BY id desc
FETCH FIRST 1 ROWS ONLY),(od.countNo));
-- using an aggregate function
Select . FROM students st, orders od
WHERE st.id = NVL((select max(id) from students
where student_id = 321),(od.countNo));
Or if you need multiple rows, rewrite your query to not use NVL:
Select . FROM students st, orders od
WHERE EXISTS (select 1 from students
where student_id = 321
and st.id = students.id
ORDER BY students.id desc
FETCH FIRST periods ROWS ONLY)
OR st.id = od.countNo;
A modified version of Gordon’s answer from yesterday is another example:
with s3 as (
select id
from students
where student_id = 321
ORDER BY id desc
FETCH FIRST periods ROWS ONLY
)
Select . FROM students st, orders od
where st.id in (select id from s3) or
(not exists (select 1 from s3) and st.id = od.countNo);