0

我有一个带有几个过滤条件的查询,其中之一是将查询作为整数参数。我只想在这个整数大于 0 时才使用这个过滤器,我不能使用 NVL,因为它永远不会为空。在这种情况下我该如何使用DECODE

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

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

4

2 回答 2

1

您可以使用一个案例:

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 在语义上对于指定“无过滤器”更有意义。

于 2015-06-08T12:24:28.617 回答
0

不要使用decode(). 它确实非常老式。您可以使用case或只使用正确的逻辑,如下所示:

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

当然,这需要使用该参数两次。但是,这也是必要的decode()

于 2015-06-08T12:26:49.993 回答