Se référant à un Alias de Colonne dans une Clause where
SELECT logcount, logUserID, maxlogtm
, DATEDIFF(day, maxlogtm, GETDATE()) AS daysdiff
FROM statslogsummary
WHERE daysdiff > 120
- Je obtenir
"nom de colonne non valide daysdiff".
Maxlogtm est un champ datetime. C'est le petit truc qui me rend fou.
- pas sûr que pour mysql, mais peut-être que l'alias doit être enveloppé dans les tiques
`daysdiff`
.
Vous devez vous connecter pour publier un commentaire.
Normalement, vous ne pouvez pas consulter les alias de champ dans le
WHERE
clause. (Pensez à l'ensemble de laSELECT
y compris les alias, est appliqué après leWHERE
clause.)Mais, comme mentionné dans d'autres réponses, vous pouvez forcer SQL pour traiter
SELECT
à traiter avant leWHERE
clause. Ceci est habituellement fait avec des parenthèses pour forcer l'ordre logique de fonctionnement, ou avec une Expression de Table Commune (CTE):Parenthèse/Sous-Sélection:
Ou voir Adam réponse à une CTE version de la même chose.
HAVING
réponse ne fonctionne pas dans la plupart des environnements SQL, y compris MS-SQL qui cette question est à propos. (En T-SQL,HAVING
nécessite une fonction d'agrégation.)Si vous voulez utiliser l'alias dans votre
WHERE
clause, vous avez besoin d'envelopper dans une sous-sélection, ou CTE:Si vous ne voulez pas faire la liste de tous vos colonnes CTE, une autre façon de le faire serait d'utiliser
extérieur s'appliquent
:Le moyen le plus efficace de le faire sans avoir à répéter votre code est l'utilisation de AVOIR au lieu de OÙ
HAVING
sur les alias n'est pas standard (il ne fonctionne sur MySQL, tout de même). Plus précisément, je pense qu'il ne fonctionne pas avec 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.
Comment sur l'utilisation d'une sous-requête(cela a fonctionné pour moi dans Mysql)?
AYANT travaille dans MySQL
selon la documentation:
Que vous pourriez consulter alias de colonne, mais vous avez besoin de la définir à l'aide de
CROSS/OUTER APPLY
:DBFiddle Démo
Pour:
WHERE/GROUP BY/ORDER BY
sql-server
ett-sql
🙂