如何在where子句中使用Oracle的解码函数

时间:2015-06-08 12:21:18

标签: sql oracle decode nvl

我有一个带有很少过滤条件的查询,其中一个是作为整数参数获取查询。我想仅在此整数为>时使用此过滤器。 0 我无法使用NVL,因为它永远不会为空。在这种情况下如何使用DECODE

SELECT (columns list)
        FROM 
        AGREEMENT A
        WHERE 
        A.ACCOUNT = 545 
        AND A.GRP_ID = NVL(?,A.GRP_ID)

我得到的参数?是一个整数

2 个答案:

答案 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()也需要这样做。