我有一个 select 语句,后面跟着一个联合。在 select 中,有一个 where 子句。我正在尝试将以下代码添加到 where 子句中,但在解决问题时遇到了问题:
declare @BudgetFilter int;
set @Budgetfilter = 0;
AND CASE @BudgetFilter WHEN 0 THEN ISNULL(Project.Contribution, 0) >= 25000 END
Run Code Online (Sandbox Code Playgroud)
错误在于 >。错误消息:“'>' 附近的语法不正确。”
一些额外的背景。预算过滤器可以是 3 个值之一。0,1,2 分别转化为 >=25K、<25K、<0。一旦我解决了这个问题,我还有其他过滤器(下拉值选择)。
谢谢。一种
CASE
是一个返回单个值的表达式。您正试图将其用作流逻辑的控制以选择性地包含过滤器,但它不会以这种方式工作。也许这样的事情会起作用:
AND COALESCE(Project.Contribution, 0) >= CASE @BudgetFilter
WHEN 0 THEN 25000 ELSE 2000000000 END
-- guessing that 2 billion is enough to always be greater
-- than the highest valid contribution
Run Code Online (Sandbox Code Playgroud)
扩展到您的三个条件,您需要使用多个表达式,因为您不能CASE
再次使用来更改>=
为<
。所以像:
AND COALESCE(Project.Contribution, 0) >= CASE @BudgetFilter
WHEN 0 THEN 25000 ELSE 2000000000 END
AND COALESCE(Project.Contribution, 0) < CASE
@BudgetFilter WHEN 1 THEN 25000 WHEN 2 THEN 0 ELSE -2000000000 END)
Run Code Online (Sandbox Code Playgroud)
或者您可以使用评论中提到的 OR 条件:
AND ((@BudgetFilter = 0 AND Project.Contribution >= 25000)
OR (@BudgetFilter IN (1,2) AND Project.Contribution < CASE
@BudgetFilter WHEN 1 THEN 25000 ELSE 0 END))
Run Code Online (Sandbox Code Playgroud)
或者您可以只使用动态 SQL,如果您有很多其他标准和/或您难以从上述变化的计划中获得一致的行为,这可能很有用:
DECLARE @sql NVARCHAR(MAX) = N'SELECT ...
WHERE ...
AND COALESCE(Project.Contribution, 0) '
+ CASE @BudgetFilter
WHEN 0 THEN ' >= 25000'
WHEN 1 THEN ' < 25000'
WHEN 2 THEN ' < 0' END + ';';
EXEC sp_executesql @sql;
Run Code Online (Sandbox Code Playgroud)
(如果您想知道为什么我使用COALESCE
而不是ISNULL
。也就是说,COALESCE
/ISNULL
在这里真的毫无意义,因为COALESCE
d 值 ( 0
) 只会可能满足< 25000
条件 - 我不确定这是否是您的意图。 )
归档时间: |
|
查看次数: |
126 次 |
最近记录: |