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 :-)

War es hilfreich?

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
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top