如果条件满足,则在where子句中添加比较参数



只有当我的输入参数不为null时,我才想在where子句中添加比较参数。我尝试了下面的查询,但它给了我错误。

CASE 
WHEN ( 
(SELECT TOP 1 (AMOUNT + ISNULL((@p_iAmountRequested * FEEPERCENTAGE), 0.0)) 
FROM CONVEYANCERLEGALFEE VF1 
WHERE VF1.CONVEYANCERLEGALFEESET = MP.CONVEYANCERLEGALFEESET 
AND VF1.LOCATION = @p_iLocation 
AND VF1.TYPEOFAPPLICATION =@p_iTypeOfApplication
AND VF1.MAXIMUMVALUE >= @p_iAmountRequested
--buyer type condition is not working                  
AND 
case when (@p_iTypeOfBuyer is not null) THEN
(VF1.TYPEOFBUYER = @p_iTypeOfBuyer)
END
AND CONVEYANCERLEGALFEESETSTRTDATE = 
(SELECT MAX(CONVEYANCERLEGALFEESETSTRTDATE) 
FROM CONVEYANCERLEGALFEE VF2 
WHERE VF1.CONVEYANCERLEGALFEESET = VF2.CONVEYANCERLEGALFEESET 
AND VF1.LOCATION = VF2.LOCATION
--AND VF1.TYPEOFBUYER = vf2.TYPEOFBUYER 
AND VF1.TYPEOFAPPLICATION = VF2.TYPEOFAPPLICATION 
AND VF1.MAXIMUMVALUE = VF2.MAXIMUMVALUE) 
ORDER BY VF1.MAXIMUMVALUE ASC ) = 0.0) 
THEN 1
ELSE 0 
END

您可以使用COALESCE而不是使用CASE语句来实现这样的功能。虽然几乎所有的数据库都支持它,但您并没有用正在使用的RDBMs来标记您的问题

执行方式:

...
AND yourFieldToTest = coalesce(@yourParameter, yourFieldToTest)
...

COALESCE将返回第一个非null参数,因此如果@yourParameter为null,则条件将为yourFieldToTest = yourFieldToTest,这将是真的,就像根本不存在一样。

旁注,COALESCE它可以接收具有相同规则的多个参数,它将像coalesce(@param1, @param2, @param3, whateverColumn, etc)一样返回第一个非null

在您的查询中:

AND VF1.TYPEOFBUYER = coalesce(@p_iTypeOfBuyer, VF1.TYPEOFBUYER)

最新更新