Hacer referencia a un alias de columna en una cláusula WHERE

Resuelto user990016 asked hace 13 años • 10 respuestas
SELECT logcount, logUserID, maxlogtm
   , DATEDIFF(day, maxlogtm, GETDATE()) AS daysdiff
FROM statslogsummary
WHERE daysdiff > 120

yo obtengo

"nombre de columna no válido díasdiff".

Maxlogtm es un campo de fecha y hora. Son las pequeñas cosas las que me vuelven loco.

user990016 avatar Dec 04 '11 01:12 user990016
Aceptado
SELECT
   logcount, logUserID, maxlogtm,
   DATEDIFF(day, maxlogtm, GETDATE()) AS daysdiff
FROM statslogsummary
WHERE ( DATEDIFF(day, maxlogtm, GETDATE() > 120)

Normalmente no puede hacer referencia a los alias de campo en la WHEREcláusula. (Piense en ello como si todos los SELECTalias, incluidos, se aplicaran después de la WHEREcláusula).

Pero, como se menciona en otras respuestas, puede obligar a SQL a tratar SELECTpara que se maneje antes de la WHEREcláusula. Esto generalmente se hace entre 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:

SELECT
   *
FROM
(
   SELECT
      logcount, logUserID, maxlogtm,
      DATEDIFF(day, maxlogtm, GETDATE()) AS daysdiff
   FROM statslogsummary   
) as innerTable
WHERE daysdiff > 120

O vea la respuesta de Adam para obtener una versión CTE del mismo.

Jamie F avatar Dec 03 '2011 19:12 Jamie F

Si desea utilizar el alias en su WHEREcláusula, debe incluirlo en una subselección o CTE :

WITH LogDateDiff AS
(
   SELECT logcount, logUserID, maxlogtm
      , DATEDIFF(day, maxlogtm, GETDATE()) AS daysdiff
   FROM statslogsummary
)
SELECT logCount, logUserId, maxlogtm, daysdiff
FROM LogDateDiff
WHERE daysdiff > 120
Adam Wenger avatar Dec 03 '2011 19:12 Adam Wenger