if condition satisfied 在 where 子句中添加比较参数
Add comparison parameter in where clause if condition satishfied
只有当我的输入参数不为空时,我才想在 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
语句来实现这样的事情。您没有使用您正在使用的 RDBM 标记您的问题,尽管几乎所有数据库都支持它。
做为:
...
AND yourFieldToTest = coalesce(@yourParameter, yourFieldToTest)
...
COALESCE
将 return 第一个非 null 参数,因此如果 @yourParameter
为 null 则条件将为 yourFieldToTest = yourFieldToTest
,这与不是时一样在那里。
旁注,COALESCE
它可以使用相同的规则接收多个参数,它将 return 第一个非 null 像 coalesce(@param1, @param2, @param3, whateverColumn, etc)
在您的查询中:
AND VF1.TYPEOFBUYER = coalesce(@p_iTypeOfBuyer, VF1.TYPEOFBUYER)
只有当我的输入参数不为空时,我才想在 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
语句来实现这样的事情。您没有使用您正在使用的 RDBM 标记您的问题,尽管几乎所有数据库都支持它。
做为:
...
AND yourFieldToTest = coalesce(@yourParameter, yourFieldToTest)
...
COALESCE
将 return 第一个非 null 参数,因此如果 @yourParameter
为 null 则条件将为 yourFieldToTest = yourFieldToTest
,这与不是时一样在那里。
旁注,COALESCE
它可以使用相同的规则接收多个参数,它将 return 第一个非 null 像 coalesce(@param1, @param2, @param3, whateverColumn, etc)
在您的查询中:
AND VF1.TYPEOFBUYER = coalesce(@p_iTypeOfBuyer, VF1.TYPEOFBUYER)