Ссылаясь на псевдоним столбца в предложении WHERE

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

Я получаю "недопустимое имя столбца daysdiff". Maxlogtm - это поле даты. Это мелочь, которая сводит меня с ума.

Ответ 1

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

Обычно вы не можете ссылаться на полевые псевдонимы в предложении WHERE. (Подумайте об этом как о SELECT, включая псевдонимы, применяется после предложения WHERE.)

Но, как упоминалось в других ответах, вы можете заставить SQL обрабатывать SELECT для обработки перед предложением WHERE. Обычно это делается с помощью скобок для принудительного логического порядка работы или с помощью Common Table Expression (CTE):

Скобки/подвыборки:

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

Или см. ответ Ада для версии CTE того же самого.

Ответ 2

Если вы хотите использовать псевдоним в своем предложении WHERE, вам нужно обернуть его в подборе select или 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

Ответ 3

Если вы не хотите перечислять все ваши столбцы в CTE, другим способом сделать это будет использование outer apply:

select
    s.logcount, s.logUserID, s.maxlogtm,
    a.daysdiff
from statslogsummary as s
    outer apply (select datediff(day, s.maxlogtm, getdate()) as daysdiff) as a
where a.daysdiff > 120

Ответ 4

Как насчет использования подзапроса (это сработало для меня в Mysql)?

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

Ответ 5

Самый эффективный способ сделать это без повторения вашего кода - использовать HAVING вместо ГДЕ

SELECT logcount, logUserID, maxlogtm
   , DATEDIFF(day, maxlogtm, GETDATE()) AS daysdiff
FROM statslogsummary
HAVING daysdiff > 120

Ответ 6

HAVING работает в MySQL согласно документации:

Предложение HAVING было добавлено в SQL, потому что ключевое слово WHERE не могло использоваться с совокупными функциями.