我有一个带有几个过滤条件的查询,其中之一是将查询作为整数参数。我只想在这个整数大于 0 时才使用这个过滤器,我不能使用 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
并且 Decode 以类似的方式工作,尽管我认为它的可读性较差。
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()
。