Heim >Datenbank >MySQL-Tutorial >Können CASE-Anweisungen direkt in JOIN-Bedingungen in SQL Server verwendet werden?
SQL Server JOIN-Bedingungen und CASE-Anweisungen: Ein genauerer Blick
Beim Arbeiten mit den Systemansichten von Microsoft SQL Server 2008 R2, wie sys.partitions
und sys.allocation_units
, hängt die Beziehung zwischen ihnen oft vom sys.allocation_units.type
-Wert ab. Ein üblicher Ansatz zum Verknüpfen dieser Tabellen könnte eine CASE
-Anweisung innerhalb der JOIN
-Bedingung beinhalten.
Sehen wir uns dieses Szenario an: Das Verbinden von sys.indexes
, sys.partitions
und sys.allocation_units
erfordert eine bedingte Verknüpfung basierend auf allocation_units.type
. Ein erster Versuch 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 jedoch zu einem Syntaxfehler. Das Problem ergibt sich aus der Tatsache, dass CASE
-Anweisungen in SQL Server Skalarwerte und keine ausführbaren Anweisungen erzeugen. Sie können den Gleichheitsvergleich innerhalb der JOIN
-Klausel nicht direkt steuern.
Die Lösung: Boolesche Auswertung mit CASE
Um dieses Problem zu lösen, müssen wir die CASE
-Anweisung umstrukturieren, um einen booleschen Wert (1 für wahr, 0 für falsch) zurückzugeben, der dann verglichen werden kann:
<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>
Durch die Verwendung von AND
innerhalb der WHEN
-Klauseln und den Vergleich des resultierenden CASE
-Ausdrucks mit 1 erstellen wir effektiv eine bedingte Verknüpfung. Dies zeigt, dass CASE
-Anweisungen zwar leistungsstark sind, ihre Verwendung innerhalb von JOIN
-Bedingungen jedoch eine sorgfältige Überlegung ihres Rückgabetyps und die Notwendigkeit einer expliziten booleschen Auswertung erfordert. Eine direkte Zuweisung oder Gleichheitsprüfung innerhalb der CASE
-Anweisung selbst innerhalb eines JOIN
wird nicht unterstützt.
Das obige ist der detaillierte Inhalt vonKönnen CASE-Anweisungen direkt in JOIN-Bedingungen in SQL Server verwendet werden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!