未正确返回值的情况
Case when not returning properly values
我有 3 个“case when”选项,但最后一个我遇到了问题:
select
case
when :wprod IN (select cod from products where standard = 'N' and disabled_date is null and classif = 1)
THEN
case when :wprod NOT IN
(select cod from invoice where seq in
(select invoice_prod from invoice_outrosdocto pout where pout.register = :register and
pout.disabled_date is null))
-- My problem are below:
THEN
CASE WHEN (SELECT * from
(SELECT selfinvoice FROM invoice WHERE seq =
(SELECT Max(invoice) FROM invoice WHERE register = :register AND cod = :wprod AND deleted IS NULL))) = 'S'
THEN 'SA'
else 'SB' end
-- How can I compare a column (selfinvoice) from the last entry date Max(invoice)?
-- I tried the selected as shown, it's great when having 'S' or 'N' explicit values, but sometimes
-- it returns 0 rows (nothing) and by this I can't compare this "case when"
-- I've also tried Nvl(selfinvoice, 0) but it didn't worked as well
end ELSE 'NB' end
else 'NC' end logic
, ' ' value
from
dual group by ' '
有没有其他方法可以解决这个问题?好像我撞到了一个大的混凝土墙......
提前致谢。
如果我没理解错的话,不是selfinvoice
需要NVL
,而是最里面的子查询,这个:
CASE
WHEN (SELECT *
FROM (SELECT selfinvoice
FROM invoice
WHERE seq = (SELECT NVL (MAX (invoice), 'X') --> here
FROM invoice
WHERE register = :register
AND cod = :wprod
AND deleted IS NULL))) = 'S'
THEN
'SA'
ELSE
'SB'
END
[编辑]
我没有你的 table 所以我试着在 Scott 的 EMP
table.
上模拟它
SQL> select distinct deptno, job from emp order by deptno, job;
DEPTNO JOB
---------- ---------
10 CLERK --> there's no ANALYST in deptno = 10
10 MANAGER
10 PRESIDENT
20 ANALYST --> ANALYST in deptno = 20
20 CLERK
20 MANAGER
30 CLERK
30 MANAGER
30 SALESMAN
9 rows selected.
这是您的查询:
SQL> SELECT CASE
2 WHEN (SELECT *
3 FROM (SELECT DISTINCT job
4 FROM emp
5 WHERE job = (SELECT MIN (job)
6 FROM emp
7 WHERE deptno = &par_deptno))) = 'ANALYST'
8 THEN
9 'sa'
10 ELSE
11 'sb'
12 END
13 FROM DUAL;
Enter value for par_deptno: 10 --> for DEPTNO = 10, it returns SB because ANALYST doesn't exist there
CA
--
sb
SQL> /
Enter value for par_deptno: 20 --> for DEPTNO = 20, it returns SA because ANALYST exists there
CA
--
sa
SQL>
你说问题是运行 SELECT selfinvoice ...
的查询没有 return 任何东西。那么让我们试试吧:这是我的“selfinvoice”查询;因为没有部门 -1
,它 returns no rows:
SQL> SELECT DISTINCT job
2 FROM emp
3 WHERE job = (SELECT MIN (job)
4 FROM emp
5 WHERE deptno = &par_deptno)
6 /
Enter value for par_deptno: -1
no rows selected
那么 complete 查询 return 是什么?
SQL> SELECT CASE
2 WHEN (SELECT *
3 FROM (SELECT DISTINCT job
4 FROM emp
5 WHERE job = (SELECT MIN (job)
6 FROM emp
7 WHERE deptno = &par_deptno))) = 'ANALYST'
8 THEN
9 'sa'
10 ELSE
11 'sb'
12 END
13 FROM DUAL;
Enter value for par_deptno: -1
CA
--
sb
SQL>
它 returns SB
,所以...它实际上 有效 ,不会失败。
如果可能,请创建一个简单的测试用例来说明您的问题;说明您想从中得到什么结果。
我有 3 个“case when”选项,但最后一个我遇到了问题:
select
case
when :wprod IN (select cod from products where standard = 'N' and disabled_date is null and classif = 1)
THEN
case when :wprod NOT IN
(select cod from invoice where seq in
(select invoice_prod from invoice_outrosdocto pout where pout.register = :register and
pout.disabled_date is null))
-- My problem are below:
THEN
CASE WHEN (SELECT * from
(SELECT selfinvoice FROM invoice WHERE seq =
(SELECT Max(invoice) FROM invoice WHERE register = :register AND cod = :wprod AND deleted IS NULL))) = 'S'
THEN 'SA'
else 'SB' end
-- How can I compare a column (selfinvoice) from the last entry date Max(invoice)?
-- I tried the selected as shown, it's great when having 'S' or 'N' explicit values, but sometimes
-- it returns 0 rows (nothing) and by this I can't compare this "case when"
-- I've also tried Nvl(selfinvoice, 0) but it didn't worked as well
end ELSE 'NB' end
else 'NC' end logic
, ' ' value
from
dual group by ' '
有没有其他方法可以解决这个问题?好像我撞到了一个大的混凝土墙...... 提前致谢。
如果我没理解错的话,不是selfinvoice
需要NVL
,而是最里面的子查询,这个:
CASE
WHEN (SELECT *
FROM (SELECT selfinvoice
FROM invoice
WHERE seq = (SELECT NVL (MAX (invoice), 'X') --> here
FROM invoice
WHERE register = :register
AND cod = :wprod
AND deleted IS NULL))) = 'S'
THEN
'SA'
ELSE
'SB'
END
[编辑]
我没有你的 table 所以我试着在 Scott 的 EMP
table.
SQL> select distinct deptno, job from emp order by deptno, job;
DEPTNO JOB
---------- ---------
10 CLERK --> there's no ANALYST in deptno = 10
10 MANAGER
10 PRESIDENT
20 ANALYST --> ANALYST in deptno = 20
20 CLERK
20 MANAGER
30 CLERK
30 MANAGER
30 SALESMAN
9 rows selected.
这是您的查询:
SQL> SELECT CASE
2 WHEN (SELECT *
3 FROM (SELECT DISTINCT job
4 FROM emp
5 WHERE job = (SELECT MIN (job)
6 FROM emp
7 WHERE deptno = &par_deptno))) = 'ANALYST'
8 THEN
9 'sa'
10 ELSE
11 'sb'
12 END
13 FROM DUAL;
Enter value for par_deptno: 10 --> for DEPTNO = 10, it returns SB because ANALYST doesn't exist there
CA
--
sb
SQL> /
Enter value for par_deptno: 20 --> for DEPTNO = 20, it returns SA because ANALYST exists there
CA
--
sa
SQL>
你说问题是运行 SELECT selfinvoice ...
的查询没有 return 任何东西。那么让我们试试吧:这是我的“selfinvoice”查询;因为没有部门 -1
,它 returns no rows:
SQL> SELECT DISTINCT job
2 FROM emp
3 WHERE job = (SELECT MIN (job)
4 FROM emp
5 WHERE deptno = &par_deptno)
6 /
Enter value for par_deptno: -1
no rows selected
那么 complete 查询 return 是什么?
SQL> SELECT CASE
2 WHEN (SELECT *
3 FROM (SELECT DISTINCT job
4 FROM emp
5 WHERE job = (SELECT MIN (job)
6 FROM emp
7 WHERE deptno = &par_deptno))) = 'ANALYST'
8 THEN
9 'sa'
10 ELSE
11 'sb'
12 END
13 FROM DUAL;
Enter value for par_deptno: -1
CA
--
sb
SQL>
它 returns SB
,所以...它实际上 有效 ,不会失败。
如果可能,请创建一个简单的测试用例来说明您的问题;说明您想从中得到什么结果。