Dynamisch ändern, welche Tabelle mit SQL -Fallanweisung ausgewählt werden soll
-
20-08-2019 - |
Frage
Ich versuche, eine gespeicherte Prozedur zu schreiben, und abhängig von einem bestimmten Spaltenwert möchte ich in der Lage sein, zu ändern, aus welcher Tabelle ich auswähle. Ich werde versuchen, ein Beispiel zu geben:
SELECT ItemNumber,
ItemType,
Description
FROM
CASE ItemType
WHEN 'A' THEN TableA
ELSE TableB
END
WHERE
CASE ItemType
WHEN 'A' THEN ItemNumber = @itemNumber
ELSE PartNumber = @itemNumber
END
Wie Sie sehen können, ändere ich nicht nur die Tabelle, aus der ich ausgewählt habe, sondern da diese beiden Tabellen von zwei verschiedenen Personen zu zwei verschiedenen Zeiten hergestellt wurden, sind die Spaltennamen auch unterschiedlich.
Meine Frage ist also: Was ist der beste Weg, um dies zu erreichen, da SQL Server meine von mir konstruierte Abfrage nicht mag.
Wenn jemand, der sieht, was ich versuche, einen besseren Weg zu tun, wäre ich alle Ohren :-)
Lösung
Sie können keine Fallanweisung in der Klausel verwenden, aber stattdessen Folgendes verwenden:
SELECT itemnumber, itemtype, description
FROM tablea
WHERE itemnumber = @itemnumber AND itemtype = 'A'
UNION ALL
SELECT itemnumber, itemtype, description
FROM tableb
WHERE partnumber = @itemnumber AND itemtype <> 'A'
Andere Tipps
Sie können versuchen, die dynamische SQL -Anweisung als Zeichenfolge zu erstellen und dann die gespeicherte SP_ExecutesQL -Prozedur aufzurufen, um die Zeichenfolge auszuführen.
Sehen hier Weitere Informationen und Beispiele.
Ich bin mir nicht sicher, warum Sie Dinge in einer SQL -Anweisung tun möchten. Ich bin keine SQL -Serverperson, aber in einem Oracle -gespeicherten Verfahren könnten Sie so etwas schreiben
If itemtype = 'A'
Then
<statement for table A>
Else
<statement for Table B>
End if
So etwas sollte auch in SQL Server funktionieren. Vielleicht könnte jemand dies erweitern?
Sie erklären wirklich nicht wo ItemType
kommt von. Wie vorgeschlagen UNION
Kann anwendbar sein, wenn Sie einfach zwei Tische kombinieren.
Hier ist eine andere Möglichkeit, die sich auf Ihr Problem beziehen kann:
SELECT ItemNumber,
ItemType,
COALESCE(TableA.Description, TableB.Description) AS Description
FROM Items
LEFT JOIN TableA
ON Items.ItemType = 'A'
AND TableA.ItemNumber = Items.ItemNumber
LEFT JOIN TableB
ON Items.ItemType <> 'A'
AND TableB.ItemNumber = Items.ItemNumber
Sie können zuerst die Union -Abfrage verwenden, um sich den Tabellen anzuschließen, und dann auswählen.
Sie können auch in Betracht ziehen, eine Ansicht für einen der Tabellen zu erstellen, sodass nur die Spalten, die Sie benötigen, während Sie sie umbenennen, dann Gewerkschaft und dann aus der Gewerkschaft auswählen.
Oder verwenden Sie eine Temp -Tabelle, um das Ergebnis aus jeder Abfrage zu speichern. Stellen Sie die Erstellung der Temp -Tabelle in einem Fall (Pseudocode, nicht getestet) ein:
CASE @itemType
WHEN 'A'
SELECT ACol1 AS Col1, ACol2 AS Col2
FROM TABLE_A
INTO #tempTable
WHERE ItemNumber = @itemNumber
ELSE
SELECT BCol1 AS Col1, BCol2 AS Col2
FROM TABLE_B
INTO #tempTable
WHERE PartNumber = @itemNumber
END
SELECT * FROM #tempTable