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

How to use Oracle's decode function in where clause

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

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

我得到的参数?是一个Integer

您可以使用案例:

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 在语义上对于指定 'no filter'.

更有意义

不要使用 decode()。它真的很老套。您可以使用 case 或只输入正确的逻辑,如:

where a.account = 545 and
      (? = 0 or a.grp_id = ?)

当然,这需要使用两次参数。然而,这对于 decode().

也是必要的