Ungültiger Spaltennamenfehler in WHERE-Klausel, Spalte, die mit CASE ausgewählt wurde

8

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:

%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 AS -Klauseln angegeben habe. Aus irgendeinem Grund darf ich die bedingten Werte nicht in einer WHERE -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?

    
Tomas Lycken 16.07.2010, 12:47
quelle

4 Antworten

11

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%     
Martin Smith 16.07.2010, 12:53
quelle
7

Sie können den Spaltennamen ChannelValue in der where-Klausel nicht auf der Ebene select verwenden.
Sie müssen diese ganze select in eine Unterabfrage einfügen.

%Vor%     
Nikhil S 16.07.2010 12:50
quelle
2

Sie können ein CTE verwenden - etwas wie

%Vor%     
StuartLC 16.07.2010 12:54
quelle
-2
___ answer3264970 ___

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.

%Vor%     
___ answer3264995 ___

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%     
___ answer3265000 ___

Sie können ein CTE verwenden - etwas wie

%Vor%     
___ qstnhdr ___ Ungültiger Spaltennamenfehler in WHERE-Klausel, Spalte, die mit CASE ausgewählt wurde ___ qstntxt ___

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?

    
___ tag123case ___ In SQL führt der CASE-Ausdruck eine Liste von Bedingungen aus und gibt das Ergebnis für die erste Bedingung zurück, die als wahr ausgewertet wird. ___ tag123tsql ___ T-SQL (Transact Structured Query Language) ist die Erweiterung der SQL-Funktionalität, die von Sybase ASE und Microsoft SQL Server unterstützt wird. Verwenden Sie dieses Tag nicht für MySQL-, PostgreSQL-, Oracle (Pl / SQL) -bezogene Abfragen. ___ tag123where ___ Eine Klausel in der Programmierung, die eine boolesche Bedingung (Prädikat) anwendet. ___ antwort43399620 ___
%Vor%     
___ tag123sqlserver ___ Microsoft SQL Server ist ein relationales Datenbankverwaltungssystem (RDBMS). Verwenden Sie dieses Tag für alle SQL Server-Editionen, einschließlich Compact, Express, Azure, Fast-Track, APS (früher PDW) und Azure SQL DW. Verwenden Sie dieses Tag nicht für andere Arten von DBMS (MySQL, PostgreSQL, Oracle usw.). Verwenden Sie dieses Tag nicht für Probleme bei der Software- und mobilen Entwicklung, es sei denn, es steht in direktem Zusammenhang mit der Datenbank. ___ tag123calculatedcolumns ___ Eine berechnete Spalte wird aus einem Ausdruck berechnet, der andere Spalten in derselben Tabelle verwenden kann ___
Redz Ch 13.04.2017 18:46
quelle