我有一个带有很少过滤条件的查询,其中一个是作为整数参数获取查询。我想仅在此整数为>时使用此过滤器。 0
我无法使用NVL,因为它永远不会为空。在这种情况下如何使用DECODE
?
SELECT (columns list)
FROM
AGREEMENT A
WHERE
A.ACCOUNT = 545
AND A.GRP_ID = NVL(?,A.GRP_ID)
我得到的参数?
是一个整数
答案 0 :(得分:0)
您可以使用案例:
SELECT (columns list)
FROM
AGREEMENT A
WHERE
A.ACCOUNT = 545
AND A.GRP_ID = CASE ? WHEN 0 THEN A.GRP_ID ELSE ? END
Andode以类似的方式工作,虽然我认为它的可读性较差。
SELECT (columns list)
FROM
AGREEMENT A
WHERE
A.ACCOUNT = 545
AND A.GRP_ID = DECODE(?, 0, A.GRP_ID, ?)
但是考虑到用例,使参数为NULL会好一些。毕竟,0是一个你想要被视为不同值的值,而NULL在语义上更有意义地指定'无过滤器'。
答案 1 :(得分:0)
不要使用decode()
。这真的很老套。您可以使用case
或只使用正确的逻辑:
where a.account = 545 and
(? = 0 or a.grp_id = ?)
当然,这需要使用两次参数。但是,decode()
也需要这样做。