【问题标题】:How to use Oracle's decode function in where clause如何在where子句中使用Oracle的decode函数
【发布时间】:2015-06-08 12:21:17
【问题描述】:
我有一个带有几个过滤条件的查询,其中之一是将查询作为整数参数。仅当此整数 > 0 时,我才想使用此过滤器
我不能使用 NVL,因为它永远不会为空。在这种情况下如何使用DECODE?
SELECT (columns list)
FROM
AGREEMENT A
WHERE
A.ACCOUNT = 545
AND A.GRP_ID = NVL(?,A.GRP_ID)
我得到的参数?是一个整数
【问题讨论】:
标签:
sql
oracle
decode
nvl
【解决方案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 在语义上更适合指定“无过滤器”。
【解决方案2】:
不要使用decode()。它确实非常老式。您可以使用case 或将正确的逻辑放入:
where a.account = 545 and
(? = 0 or a.grp_id = ?)
当然,这需要使用该参数两次。但是,decode() 也需要这样做。