2

在女巫中有一个棘手的情况,我相信你们可以帮助我。我想在我的光标 where 子句中使用 decode 。我正在使用“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; 
4

1 回答 1

0

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 表达式返回两个值,这是不可能的。您最多可以从表达式中返回一个,就像函数一样。

可以使用IN 列表中的DECODE编写:

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)

于 2015-08-27T08:28:46.477 回答