【问题标题】:How to use case function in SQL where clause?如何在 SQL where 子句中使用 case 函数?
【发布时间】:2021-08-27 19:11:00
【问题描述】:

我正在将 Crystal Report 转换为 SSRS。在 CR 选择记录部分有几个过滤器,包括这样的 IF 语句:

(if BeginCompany <> 0 and EndCompany <> 999 then
     Company between BeginCompany and EndCompany else 1 = 1)

如何在我的数据集中的 SQL WHERE 子句中创建等效的 CASE 语句?谢谢。

【问题讨论】:

  • 仅供参考 case 是一个表达式而不是一个语句
  • 根据问题指南,请展示您的尝试并告诉我们您发现了什么(在本网站或其他地方)以及为什么它不能满足您的需求。
  • 那么如果 BeginCompany 是一个“有效值”而 EndCompany 是 999,你就忽略这两个?

标签: sql sql-server reporting-services


【解决方案1】:

BeginCompanyEndCompany 实际上是变量吗?当您不想将它们用作过滤器时,它们是什么?空值?还有什么?

也许您正在寻找这个(假设公司用正整数表示):

WHERE Company >= COALESCE(@BeginCompany, 0)
  AND Company <= COALESCE(@EndCompany, 2147483647)

这只是另一种表达方式:

WHERE Company >= CASE 
      WHEN @BeginCompany IS NULL THEN 0 ELSE @BeginCompany END
  AND Company <= CASE
      WHEN @EndCompany IS NULL THEN 2147483647 ELSE @EndCompany END

不能使用CASE 表达式来控制流,例如

CASE ... something ... THEN Column BETWEEN x AND y

CASE 是一个返回单个值的表达式。更多背景信息:

【讨论】:

    【解决方案2】:

    如果 BeginCompany 0 和 EndCompany 999 来显示记录,那么逻辑似乎希望 Company 字段位于 BeginCompany 和 EndCompany 参数之间,但如果它们等于 0 或 999,则显示所有记录。如果用户在 Begin 参数中输入 0 或在 end 参数中输入 999,则查询将显示所有记录。

    我认为在 SQL 中会是

    WHERE   (
            @BeginCompany <> 0 
            and @EndCompany <> 999 
            AND Company between @BeginCompany and @EndCompany
            )
        OR  (
            @BeginCompany = 0 
            OR
            @EndCompany = 999
            )
    

    如果你真的想挤一个 CASE 语句 if there then

    WHERE CASE WHEN 
                    @BeginCompany <> 0 
                    and @EndCompany <> 999 
                    AND Company between @BeginCompany and @EndCompany
                THEN 1
                WHEN 
                    @BeginCompany = 0 
                    OR
                    @EndCompany = 999
                THEN 1
                ELSE 0 END = 1
    

    【讨论】:

    • 仅供参考 case 是一个表达式而不是一个语句
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-16
    • 2017-01-27
    • 1970-01-01
    • 1970-01-01
    • 2014-11-20
    相关资源
    最近更新 更多