SELECT logcount, logUserID, maxlogtm
, DATEDIFF(day, maxlogtm, GETDATE()) AS daysdiff
FROM statslogsummary
WHERE daysdiff > 120
Je reçois
"nom de colonne non valide daysdiff".
Maxlogtm est un champ datetime. Ce sont les petites choses qui me rendent fou.
sql
sql-server
tsql
sql-server-2005
user990016
la source
la source
`daysdiff`
.Réponses:
Normalement, vous ne pouvez pas faire référence aux alias de champ dans la
WHERE
clause. (Considérez-le comme l'ensemble desSELECT
alias, y compris, est appliqué après laWHERE
clause.)Mais, comme mentionné dans d'autres réponses, vous pouvez forcer SQL à traiter
SELECT
pour être traité avant laWHERE
clause. Cela se fait généralement 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 la réponse d'Adam pour une version CTE de la même chose.
la source
HAVING
réponse ne fonctionne pas dans la plupart des environnements SQL, y compris MS-SQL sur lequel porte cette question. (Dans T-SQL,HAVING
nécessite une fonction d'agrégation.)Si vous souhaitez utiliser l'alias dans votre
WHERE
clause, vous devez l'envelopper dans un sous-select, ou CTE :la source
Le moyen le plus efficace de le faire sans répéter votre code est d'utiliser HAVING au lieu de WHERE
la source
HAVING
d'alias n'est pas standard (cela fonctionne sur MySQL, cependant). Plus précisément, je pense que cela 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.
Si vous ne souhaitez pas lister toutes vos colonnes dans CTE, une autre façon de le faire serait d'utiliser
outer apply
:la source
Que diriez-vous d'utiliser une sous-requête (cela a fonctionné pour moi dans Mysql)?
la source
HAVING fonctionne dans MySQL selon la documentation:
la source
Vous pouvez faire référence à l'alias de colonne, mais vous devez le définir en utilisant
CROSS/OUTER APPLY
:Démo DBFiddle
Avantages:
WHERE/GROUP BY/ORDER BY
la source
sql-server
ett-sql
:)Je suis venu ici à la recherche quelque chose de semblable, mais avec un cas où, et a fini en utilisant l'où comme ceci:
WHERE (CASE WHEN COLUMN1=COLUMN2 THEN '1' ELSE '0' END) = 0
vous pourriez peut - être utiliserDATEDIFF
dans leWHERE
directement. Quelque chose comme:la source