Heim >Datenbank >MySQL-Tutorial >Können CASE-Anweisungen in JOIN-Bedingungen in SQL Server verwendet werden?
SQL Server JOINs und CASE-Anweisungen: Eine häufige Gefahr
In SQL Server 2008 R2 (und späteren Versionen) kann der Versuch, eine CASE
-Anweisung direkt innerhalb einer JOIN
-Bedingung zum Definieren der Join-Kriterien zu verwenden, zu Syntaxfehlern führen. Lassen Sie uns untersuchen, warum und wie Sie dieses Problem lösen können.
Betrachten Sie die Beziehung zwischen sys.partitions
und sys.allocation_units
, wobei die Verknüpfung vom sys.allocation_units.type
-Wert abhängt. Ein naiver Ansatz könnte so aussehen:
<code class="language-sql">SELECT * FROM sys.indexes i JOIN sys.partitions p ON i.index_id = p.index_id JOIN sys.allocation_units a ON CASE WHEN a.type IN (1, 3) THEN a.container_id = p.hobt_id WHEN a.type IN (2) THEN a.container_id = p.partition_id END</code>
Dies führt zu dem Fehler „Falsche Syntax in der Nähe von ‚=‘“. Das Problem besteht darin, dass der CASE
-Ausdruck selbst kein boolesches (TRUE/FALSE) Ergebnis erzeugt, das für eine Join-Bedingung geeignet ist. Stattdessen wird entweder a.container_id = p.hobt_id
oder a.container_id = p.partition_id
zurückgegeben, wobei keines davon für sich genommen eine gültige Join-Bedingung ist.
Der richtige Ansatz: Boolesche Auswertung
Um dies zu beheben, benötigen wir den Ausdruck CASE
, um einen booleschen Wert zu liefern. Wir können dies erreichen, indem wir die CASE
-Anweisung so strukturieren, dass sie 1 für wahr und 0 für falsch zurückgibt, und dann das Ergebnis mit 1 vergleichen:
<code class="language-sql">SELECT * FROM sys.indexes i JOIN sys.partitions p ON i.index_id = p.index_id JOIN sys.allocation_units a ON CASE WHEN a.type IN (1, 3) AND a.container_id = p.hobt_id THEN 1 WHEN a.type IN (2) AND a.container_id = p.partition_id THEN 1 ELSE 0 END = 1</code>
Jetzt wird die CASE
-Anweisung nur dann zu 1 ausgewertet, wenn die entsprechenden Bedingungen (basierend auf a.type
) und die Gleichheitsprüfung (a.container_id = p.hobt_id
oder a.container_id = p.partition_id
) beide wahr sind. Der = 1
-Vergleich liefert dann das notwendige boolesche Ergebnis für die JOIN
-Bedingung. Diese überarbeitete Abfrage verknüpft die Tabellen korrekt. Diese Methode stellt sicher, dass die JOIN
-Bedingung einen wahren oder falschen Wert ergibt, sodass der Join wie vorgesehen funktionieren kann.
Das obige ist der detaillierte Inhalt vonKönnen CASE-Anweisungen in JOIN-Bedingungen in SQL Server verwendet werden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!