Ich habe eine (ziemlich komplizierte) SQL-Anweisung, wo ich Daten aus vielen verschiedenen Tabellen auswähle und um mit einer schlechten alten Datenstruktur fertig zu werden, habe ich ein paar benutzerdefinierte Spalten, die ihre Werte basierend auf Werten aus anderen Spalten erhalten. Ich habe das momentan mit CASE
statements gelöst:
Ich erhalte alle Ergebnisse, die ich erwarte, wenn ich die Abfrage in MS SQL Server Management Studio ausführe, und die Spaltennamen werden aufgelistet, wie ich in meinen AS
-Klauseln angegeben habe. Aus irgendeinem Grund darf ich die bedingten Werte nicht in einer WHERE
-Anweisung verwenden. Wenn ich
am Ende der Abfrage, bekomme ich einen Fehler in dieser Zeile sagen
Nachricht 207, Ebene 16, Status 1, Zeile 152
Ungültiger Spaltenname 'ChannelValue'
Warum ist das nicht erlaubt? Was sollte ich stattdessen tun?
Der einzige Teil der SQL-Anweisung, in dem die Verwendung eines in der SELECT
-Liste deklarierten Alias zulässig ist, ist die ORDER BY
-Klausel. Für andere Teile der Abfrage müssen Sie nur den gesamten CASE-Ausdruck wiederholen und dem Optimierer vertrauen, dass er identisch ist.
Wenn Sie SQL2005 + verwenden, können Sie ein CTE verwenden, um dieses Problem zu vermeiden, das manchmal die Lesbarkeit erleichtert.
%Vor% Sie können den Spaltennamen %code% in der where-Klausel nicht auf der Ebene %code% verwenden.
Sie müssen diese ganze %code% in eine Unterabfrage einfügen.
Der einzige Teil der SQL-Anweisung, in dem die Verwendung eines in der %code% -Liste deklarierten Alias zulässig ist, ist die %code% -Klausel. Für andere Teile der Abfrage müssen Sie nur den gesamten CASE-Ausdruck wiederholen und dem Optimierer vertrauen, dass er identisch ist.
Wenn Sie SQL2005 + verwenden, können Sie ein CTE verwenden, um dieses Problem zu vermeiden, das manchmal die Lesbarkeit erleichtert.
%Vor%Sie können ein CTE verwenden - etwas wie
%Vor%Ich habe eine (ziemlich komplizierte) SQL-Anweisung, wo ich Daten aus vielen verschiedenen Tabellen auswähle und um mit einer schlechten alten Datenstruktur fertig zu werden, habe ich ein paar benutzerdefinierte Spalten, die ihre Werte basierend auf Werten aus anderen Spalten erhalten. Ich habe das momentan mit %code% statements gelöst:
%Vor%Ich erhalte alle Ergebnisse, die ich erwarte, wenn ich die Abfrage in MS SQL Server Management Studio ausführe, und die Spaltennamen werden aufgelistet, wie ich in meinen %code% -Klauseln angegeben habe. Aus irgendeinem Grund darf ich die bedingten Werte nicht in einer %code% -Anweisung verwenden. Wenn ich
hinzufüge %Vor%am Ende der Abfrage, bekomme ich einen Fehler in dieser Zeile sagen
Nachricht 207, Ebene 16, Status 1, Zeile 152
Ungültiger Spaltenname 'ChannelValue'
Warum ist das nicht erlaubt? Was sollte ich stattdessen tun?
Tags und Links sql-server tsql case calculated-columns where