SQL Server: Verwendung des CASE WHEN-Ausdrucks mit der WHERE-Klausel
P粉270842688
P粉270842688 2024-04-03 14:46:55
0
1
513

Ich habe ein neues Spring Boot-Projekt mit SQL Server und muss die nativen MySQL-Abfragen für die Repository-Methoden im alten Projekt durch native SQL Server-Abfragen ersetzen. Dies ist eine komplexe Abfrage, bei der die Bedingung ein Case-When-Ausdruck ist. Wenn ich versuche, die Abfrage in SQL Server Management Studio zu testen, wird der Fehler wie im Bild unten gezeigt angezeigt. Geben Sie hier eine Bildbeschreibung ein

Dies ist meine alte native Abfrage, die MySQL für die Repository-Methode verwendet, und ich möchte sie durch SQL Server ersetzen Geben Sie hier eine Bildbeschreibung ein Bitte helfen Sie mir, eine Lösung zu finden. Vielen Dank im Voraus! !

P粉270842688
P粉270842688

Antworte allen(1)
P粉904191507

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

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 作为拼凑以避免为八个特定过滤器值添加参数。如果我想同时过滤商家名称和商店名称,则无法使用此方法。

Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage