SELECT logcount, logUserID, maxlogtm
, DATEDIFF(day, maxlogtm, GETDATE()) AS daysdiff
FROM statslogsummary
WHERE daysdiff > 120
yo obtengo
"nombre de columna inválido daysdiff".
Maxlogtm es un campo de fecha y hora. Son las pequeñas cosas que me vuelven loco.
sql
sql-server
tsql
sql-server-2005
usuario990016
fuente
fuente
`daysdiff`
.Respuestas:
Normalmente no puede hacer referencia a los alias de campo en la
WHERE
cláusula. (Piense en ello como todo elSELECT
alias incluido, se aplica después de laWHERE
cláusula).Pero, como se menciona en otras respuestas, puede forzar el tratamiento de SQL para
SELECT
que se maneje antes de laWHERE
cláusula. Esto generalmente se hace con paréntesis para forzar el orden lógico de operación o con una expresión de tabla común (CTE):Paréntesis / Subselección:
O vea la respuesta de Adam para una versión CTE de la misma.
fuente
HAVING
respuesta no funciona en la mayoría de los entornos SQL, incluido MS-SQL sobre el que trata esta pregunta. (En T-SQL,HAVING
requiere una función agregada.)Si desea utilizar el alias en su
WHERE
cláusula, debe ajustarlo en una sub selección, o CTE :fuente
La forma más efectiva de hacerlo sin repetir su código es usar HAVING en lugar de WHERE
fuente
HAVING
alias no es estándar (aunque funciona en MySQL). Específicamente, creo que no funciona con SQL Server.[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.
Si no desea enumerar todas sus columnas en CTE, otra forma de hacerlo sería usar
outer apply
:fuente
¿Qué tal usar una subconsulta (esto funcionó para mí en Mysql)?
fuente
HABER funciona en MySQL de acuerdo con la documentación:
fuente
Puede hacer referencia al alias de columna, pero debe definirlo usando
CROSS/OUTER APPLY
:DBFiddle Demo
Pros:
WHERE/GROUP BY/ORDER BY
fuente
sql-server
yt-sql
:)Vine aquí buscando algo similar a eso, pero con un caso cuando, y terminó usando el dónde de esta manera:
WHERE (CASE WHEN COLUMN1=COLUMN2 THEN '1' ELSE '0' END) = 0
tal vez se podría utilizarDATEDIFF
en elWHERE
directamente. Algo como:fuente