在 where 子句中使用解码,使用 "in"
Using decode in where clause, with "in"
遇到棘手的情况我相信你们可以帮助我。
我想在我的游标 where-clause 中使用解码。我正在使用 "IN()" 但我相信程序认为逗号属于解码而不是值之间的分隔符。
我想也许使用 CASE 可以解决这个问题,对吗?
CURSOR order_cur (
cur_ao VARCHAR2) IS
SELECT t1.nr, t1.status$nr
FROM eh_order_t@NGEXT_DBLINK t1
WHERE t1.status$nr IN (3, 6)
AND t1.ao IN (DECODE (
cur_ao,
'ALLA', Argus_ehandel_pkg.get_ehorder_ao (
t1.nr),
SUBSTR (cur_ao, 1, 2), SUBSTR (cur_ao, 3, 2)))
案例变体
CURSOR order_cur (
cur_ao VARCHAR2) IS
SELECT t1.nr, t1.status$nr
FROM eh_order_t@NGEXT_DBLINK t1
WHERE t1.status$nr IN (3, 6)
AND t1.ao IN (CASE
WHEN cur_ao = 'ALLA'
THEN
Argus_ehandel_pkg.get_ehorder_ao (t1.nr)
ELSE
SUBSTR (cur_ao, 1, 2), SUBSTR (cur_ao, 3, 2)
END) -- SUBSTR (cur_ao, 3, 2) END)
--AND t1.nr = DECODE (order_in, NULL, t1.nr, order_in)
ORDER BY t1.skapad_dat ASC;
DECODE 是一个表达式,它将在 IN 列表中与列表中的其他值一起工作,您只需要注意 语法 和 括号 。
重要的是计算 DECODE 表达式后得到的最终值。 DECODE 中的逗号分隔值将作为 DECODE 表达式的一部分进行评估。并且关闭 DECODE 表达式括号后的值,但在 IN 列表 内将被视为在 IN 列表中。
例如,
SQL> SELECT deptno FROM emp
2 WHERE deptno IN(decode(ename, 'KING', 20, 10), 30);
DEPTNO
----------
30
30
30
30
10
30
30
10
8 rows selected.
SQL>
IN 列表中有两个逗号分隔值。 DECODE 表达式被计算为 10
,并且 20
在 IN 列表中。所以,IN列表最终被评估为:
WHERE deptno = 10 OR deptno = 20
10 是 DECODE 的结果,而 30 在 IN 列表.
中是硬编码的
更新:
OP 发布了一个 CASE 表达式,同样可以使用 DECODE.
编写
您的 CASE 表达式将抛出错误,因为您正试图从 CASE 表达式 return 两个值,这是不可能的。您最多可以 return 从表达式中得到 单个值 ,就像 函数 .
可以用 DECODE 写成 IN 列表:
IN(
DECODE(cur_ao, 'ALLA', Argus_ehandel_pkg.get_ehorder_ao (t1.nr), SUBSTR (cur_ao, 1, 2))),
SUBSTR (cur_ao, 1, 2)
)
在上面的IN列表中,有两个值,第一个由DECODE表达式求值,另一个是SUBSTR (cur_ao, 1, 2)
.
遇到棘手的情况我相信你们可以帮助我。 我想在我的游标 where-clause 中使用解码。我正在使用 "IN()" 但我相信程序认为逗号属于解码而不是值之间的分隔符。
我想也许使用 CASE 可以解决这个问题,对吗?
CURSOR order_cur (
cur_ao VARCHAR2) IS
SELECT t1.nr, t1.status$nr
FROM eh_order_t@NGEXT_DBLINK t1
WHERE t1.status$nr IN (3, 6)
AND t1.ao IN (DECODE (
cur_ao,
'ALLA', Argus_ehandel_pkg.get_ehorder_ao (
t1.nr),
SUBSTR (cur_ao, 1, 2), SUBSTR (cur_ao, 3, 2)))
案例变体
CURSOR order_cur (
cur_ao VARCHAR2) IS
SELECT t1.nr, t1.status$nr
FROM eh_order_t@NGEXT_DBLINK t1
WHERE t1.status$nr IN (3, 6)
AND t1.ao IN (CASE
WHEN cur_ao = 'ALLA'
THEN
Argus_ehandel_pkg.get_ehorder_ao (t1.nr)
ELSE
SUBSTR (cur_ao, 1, 2), SUBSTR (cur_ao, 3, 2)
END) -- SUBSTR (cur_ao, 3, 2) END)
--AND t1.nr = DECODE (order_in, NULL, t1.nr, order_in)
ORDER BY t1.skapad_dat ASC;
DECODE 是一个表达式,它将在 IN 列表中与列表中的其他值一起工作,您只需要注意 语法 和 括号 。
重要的是计算 DECODE 表达式后得到的最终值。 DECODE 中的逗号分隔值将作为 DECODE 表达式的一部分进行评估。并且关闭 DECODE 表达式括号后的值,但在 IN 列表 内将被视为在 IN 列表中。
例如,
SQL> SELECT deptno FROM emp
2 WHERE deptno IN(decode(ename, 'KING', 20, 10), 30);
DEPTNO
----------
30
30
30
30
10
30
30
10
8 rows selected.
SQL>
IN 列表中有两个逗号分隔值。 DECODE 表达式被计算为 10
,并且 20
在 IN 列表中。所以,IN列表最终被评估为:
WHERE deptno = 10 OR deptno = 20
10 是 DECODE 的结果,而 30 在 IN 列表.
中是硬编码的更新:
OP 发布了一个 CASE 表达式,同样可以使用 DECODE.
编写您的 CASE 表达式将抛出错误,因为您正试图从 CASE 表达式 return 两个值,这是不可能的。您最多可以 return 从表达式中得到 单个值 ,就像 函数 .
可以用 DECODE 写成 IN 列表:
IN(
DECODE(cur_ao, 'ALLA', Argus_ehandel_pkg.get_ehorder_ao (t1.nr), SUBSTR (cur_ao, 1, 2))),
SUBSTR (cur_ao, 1, 2)
)
在上面的IN列表中,有两个值,第一个由DECODE表达式求值,另一个是SUBSTR (cur_ao, 1, 2)
.