我有一个带有 SQL Server 的新 Spring Boot 项目,我需要用 SQL Server 本机查询替换旧项目中存储库方法上的 MySQL 本机查询。这是一个复杂的查询,其中条件为 case when 表达式。当我尝试在 SQL Server Management Studio 中测试该查询时,它显示如下图所示的错误。 在此输入图像描述
这是我在存储库方法上使用 MySQL 的旧本机查询,我想将其替换为 SQL Server 在此输入图像描述 请帮助我找到解决方案。 预先感谢您!!
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 并没有什么魔力。使用任何类型的任何值。
因此,当 CASE 表达式返回 0(实际上不是 1)时,该行将被忽略(从结果集中删除)。
鉴于您的查询实际上是在应用程序中构建的,您应该考虑动态构建查询并根据需要添加参数。这可能会生成更有效的查询,数据库引擎可以更好地优化该查询。或者,您可以查看此厨房水槽讨论和 Erland 的关于动态搜索条件的讨论。 TBH 看起来有人使用 @num
作为拼凑以避免为八个特定过滤器值添加参数。如果我想同时过滤商家名称和商店名称,则无法使用此方法。