[英]How to use Oracle's decode function in where clause
我有一个很少有过滤条件的查询,其中一个是作为整数参数进入查询的。 我只想在此整数> 0时使用此过滤器,因为它永远不会为null,所以我不能使用NVL。 在这种情况下如何使用DECODE
?
SELECT (columns list)
FROM
AGREEMENT A
WHERE
A.ACCOUNT = 545
AND A.GRP_ID = NVL(?,A.GRP_ID)
参数?
我得到的是整数
您可以使用一个案例:
SELECT (columns list)
FROM
AGREEMENT A
WHERE
A.ACCOUNT = 545
AND A.GRP_ID = CASE ? WHEN 0 THEN A.GRP_ID ELSE ? END
尽管我认为解码的可读性较差,但解码的工作方式与此类似。
SELECT (columns list)
FROM
AGREEMENT A
WHERE
A.ACCOUNT = 545
AND A.GRP_ID = DECODE(?, 0, A.GRP_ID, ?)
但是给定用例,将参数设置为NULL会更好一些。 毕竟,0是您要视为其他值的值,而NULL在语义上对于指定“无过滤器”更有意义。
不要使用decode()
。 它确实是非常老式的。 您可以使用case
或仅输入正确的逻辑,如下所示:
where a.account = 545 and
(? = 0 or a.grp_id = ?)
当然,这需要两次使用参数。 但是,这对于decode()
也是必要的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.