首页  >  问答  >  正文

SQL Server:使用带有 WHERE 子句的 CASE WHEN 表达式

我有一个带有 SQL Server 的新 Spring Boot 项目,我需要用 SQL Server 本机查询替换旧项目中存储库方法上的 MySQL 本机查询。这是一个复杂的查询,其中条件为 case when 表达式。当我尝试在 SQL Server Management Studio 中测试该查询时,它显示如下图所示的错误。 在此输入图像描述

这是我在存储库方法上使用 MySQL 的旧本机查询,我想将其替换为 SQL Server 在此输入图像描述 请帮助我找到解决方案。 预先感谢您!!

P粉270842688P粉270842688180 天前361

全部回复(1)我来回复

  • P粉904191507

    P粉9041915072024-04-04 13:18:23

    这就是您所拥有的内容以及您应该在问题中以文本形式发布的内容。作为文本,试图帮助您的人可以搜索和复制它。

    case when @num = 1 then p.merchant_name = @query else 1=1 end

    CASE 是 TSQL 中的表达式。它不像许多其他语言那样是一种流控制结构。要使用“可选”过滤器,您需要使用 CASE 构造一个布尔表达式来正确处理“可选”属性。通常,使用 CASE 可以更复杂地完成此操作,如下所示:

    case when @num = 1 and p.merchant_name <> @query then 0 else 1 end = 1

    所以这里使用CASE来返回一个可以在比较中测试的值。使用 0 或 1 并没有什么魔力。使用任何类型的任何值。

    • 当 @num 为 1 并且值不匹配时,返回 THEN 分支 (0)。
    • 当 @num 为 1 并且值匹配时,返回 ELSE 分支 (1)。
    • 当 @num 不是 1 时,返回 ELSE 分支 (1)。

    因此,当 CASE 表达式返回 0(实际上不是 1)时,该行将被忽略(从结果集中删除)。

    鉴于您的查询实际上是在应用程序中构建的,您应该考虑动态构建查询并根据需要添加参数。这可能会生成更有效的查询,数据库引擎可以更好地优化该查询。或者,您可以查看此厨房水槽讨论和 Erland 的关于动态搜索条件的讨论。 TBH 看起来有人使用 @num 作为拼凑以避免为八个特定过滤器值添加参数。如果我想同时过滤商家名称和商店名称,则无法使用此方法。

    回复
    0
  • 取消回复