如何在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()
.
也是必要的
我有一个过滤条件很少的查询,其中之一是作为整数参数进入查询。仅当此整数 > 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()
.