在下表中
ID AMT
-------------
347 0.00
575 725.00
362 125.00
540 80.00
我想在where子句中使用case语句,以基于存储过程的两个输入参数过滤结果。这是我的SP的样子
CREATE PROC SS(@AMT_GREATER_THAN INT, @AMT_LESS_THAN INT)
AS
BEGIN
SELECT ID, AMT FROM TABLE
WHERE
1 = CASE WHEN @AMT_GREATER_THAN IS NOT NULL AND @AMT_LESS_THAN IS NOT
NULL AND AMT BETWEEN @AMT_LESS_THAN AND @AMT_GREATER_THAN
THEN 1
WHEN @AMT_GREATER_THAN IS NOT NULL AND AMT > @AMT_GREATER_THAN
THEN 1
WHEN @AMT_LESS_THAN IS NOT NULL AND AMT < @AMT_LESS_THAN
THEN 1
ELSE 0 END
END
执行SP时,我期望输出为
EXEC SS 50, 150 //OUTPUT should be 80 and 125
EXEC SS null, 150 //OUTPUT should be 0, 80 and 125
EXEC SS 50, null//OUTPUT should be 80 and 125, 725
但是我得到的是所有四个AMT列值,谁能指出我的问题所在。预先感谢。
答案 0 :(得分:0)
我认为您可以使用以下查询来简化:
SELECT ID, AMT FROM TABLE
WHERE (@AMT_GREATER_THAN IS NOT NULL AND @AMT_LESS_THAN IS NOT
NULL AND AMT BETWEEN @AMT_LESS_THAN AND @AMT_GREATER_THAN)
OR (@AMT_GREATER_THAN IS NOT NULL AND AMT > @AMT_GREATER_THAN)
OR (@AMT_LESS_THAN IS NOT NULL AND AMT < @AMT_LESS_THAN)
答案 1 :(得分:0)
跳过case
表达式,改用and
/ or
:
SELECT ID, AMT FROM TABLE
WHERE (AMT < @AMT_GREATER_THAN OR @AMT_GREATER_THAN IS NULL)
AND (AMT > @AMT_LESS_THAN OR @AMT_LESS_THAN IS NULL)
也许您想要>=
和<=
? (GREATER_THAN
和LESS_THAN
名称在查询中的作用相反。哪个值更高?)