Heim >Datenbank >MySQL-Tutorial >Können CASE-Anweisungen in JOIN-Bedingungen in SQL Server verwendet werden?

Können CASE-Anweisungen in JOIN-Bedingungen in SQL Server verwendet werden?

Susan Sarandon
Susan SarandonOriginal
2025-01-20 07:17:08874Durchsuche

Can CASE Statements Be Used in JOIN Conditions in SQL Server?

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn