SELECT logcount, logUserID, maxlogtm
, DATEDIFF(day, maxlogtm, GETDATE()) AS daysdiff
FROM statslogsummary
WHERE daysdiff > 120
Ich bekomme
"ungültiger Spaltenname daysdiff".
Maxlogtm ist ein Datum / Uhrzeit-Feld. Es sind die kleinen Dinge, die mich verrückt machen.
sql
sql-server
tsql
sql-server-2005
user990016
quelle
quelle
`daysdiff`
.Antworten:
Normalerweise können Sie in der
WHERE
Klausel nicht auf Feldaliasnamen verweisen . (Betrachten Sie es als das gesamteSELECT
einschließlich Aliase, wird nach derWHERE
Klausel angewendet .)Wie in anderen Antworten erwähnt, können Sie jedoch die Behandlung
SELECT
von SQL vor derWHERE
Klausel erzwingen . Dies erfolgt normalerweise in Klammern, um die logische Reihenfolge der Operationen zu erzwingen, oder mit einem Common Table Expression (CTE):Klammer / Unterauswahl:
Oder sehen Sie Adams Antwort für eine CTE-Version derselben.
quelle
HAVING
Antwort funktioniert in den meisten SQL-Umgebungen nicht, einschließlich MS-SQL, um das es in dieser Frage geht. (In T-SQLHAVING
erfordert eine Aggregatfunktion.)Wenn Sie den Alias in Ihrer
WHERE
Klausel verwenden möchten , müssen Sie ihn in eine Unterauswahl oder einen CTE einschließen :quelle
Der effektivste Weg, dies zu tun, ohne Ihren Code zu wiederholen, ist die Verwendung von HAVING anstelle von WHERE
quelle
HAVING
von Aliasen ist kein Standard (funktioniert jedoch unter MySQL). Insbesondere denke ich, dass es mit SQL Server nicht funktioniert.[S0001][207] Invalid column name 'daysdiff'
[S0001][8121] Column 'day' is invalid in the HAVING clause because it is not contained in either an aggregate function or the GROUP BY clause.
Wenn Sie nicht alle Ihre Spalten in CTE auflisten möchten, können Sie dies folgendermaßen tun
outer apply
:quelle
Wie wäre es mit einer Unterabfrage (dies hat bei mir in MySQL funktioniert)?
quelle
HAVING funktioniert in MySQL gemäß Dokumentation:
quelle
Sie können auf Spaltenalias verweisen, müssen ihn jedoch wie folgt definieren
CROSS/OUTER APPLY
:DBFiddle Demo
Vorteile:
WHERE/GROUP BY/ORDER BY
quelle
sql-server
undt-sql
:)Kam hierher und sah ähnlich aus, aber mit einem CASE WHEN, und beendete die Verwendung des Wo wie folgt:
WHERE (CASE WHEN COLUMN1=COLUMN2 THEN '1' ELSE '0' END) = 0
Vielleicht könnten SieDATEDIFF
in derWHERE
direkt verwenden. Etwas wie:quelle