在 where 子句中使用解码,并带有“in”
Posted
技术标签:
【中文标题】在 where 子句中使用解码,并带有“in”【英文标题】:Using decode in where clause, with "in" 【发布时间】:2015-11-21 12:32:04 【问题描述】:女巫遇到了一个棘手的情况,我相信你们可以帮助我。 我想在我的光标 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)))
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 (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;
【问题讨论】:
确定它确实认为它属于解码,如果你把它放在解码括号内...... 小心...可能很贵很贵! 【参考方案1】: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表达式求值,另一个由DECODE表达式求值SUBSTR (cur_ao, 1, 2)
.
【讨论】:
很好的解释,我想要达到的结果是: IF cur_ao = 'ALLA' THEN ao IN (Argus_ehandel_pkg.get_ehorder_ao (t1.nr)) ELSE ao IN (SUBSTR (cur_ao, 1, 2) , SUBSTR (cur_ao, 3, 2)) END IF; @Crazy2crack 是的,这是一个错字。谢谢,我更正了。以上是关于在 where 子句中使用解码,并带有“in”的主要内容,如果未能解决你的问题,请参考以下文章
SQL:如何在带有“NOT IN”条件的“Where”子句中使用“and”和“or”
具有多个带有 AND 类型逻辑连接的 where IN 子句的配置单元查询
如何使用 IN 修复 Hibernate Named Native Query 的 Where 子句
Doctrine2 查询(Builder)在使用“where”和“in”子句后失去关系
带有 dapper 和 postgresql 的“WHERE x IN y”子句抛出 42601:在 \"$1\" 处或附近出现语法错误