SELECT logcount, logUserID, maxlogtm
, DATEDIFF(day, maxlogtm, GETDATE()) AS daysdiff
FROM statslogsummary
WHERE daysdiff > 120
saya mendapat
+ msgstr "nama kolom hari tidak valid".
Maxlogtm adalah bidang datetime. Hal-hal kecil yang membuatku gila.
sql
sql-server
tsql
sql-server-2005
pengguna990016
sumber
sumber
`daysdiff`
.Jawaban:
Biasanya Anda tidak bisa merujuk ke alias bidang dalam
WHERE
klausa. (Anggap saja sebagai keseluruhanSELECT
termasuk alias, diterapkan setelahWHERE
klausa.)Tapi, seperti yang disebutkan dalam jawaban lain, Anda bisa memaksa SQL untuk memperlakukan
SELECT
agar ditangani sebelumWHERE
klausa. Ini biasanya dilakukan dengan tanda kurung untuk memaksakan urutan operasi logis atau dengan Common Table Expression (CTE):Parenthesis / Subselect:
Atau lihat jawaban Adam untuk versi CTE yang sama.
sumber
HAVING
Jawabannya tidak berfungsi di sebagian besar lingkungan SQL, termasuk MS-SQL yang menjadi pertanyaan. (Dalam T-SQL,HAVING
membutuhkan fungsi agregat.)Jika Anda ingin menggunakan alias dalam
WHERE
klausa Anda, Anda harus membungkusnya dalam sub pilih, atau CTE :sumber
Cara paling efektif untuk melakukannya tanpa mengulangi kode Anda adalah menggunakan HAVING dan bukannya WHERE
sumber
HAVING
alias tidak standar (itu berfungsi pada MySQL, meskipun). Secara khusus, saya pikir itu tidak berfungsi dengan 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.
Jika Anda tidak ingin membuat daftar semua kolom Anda di CTE, cara lain untuk melakukannya adalah dengan menggunakan
outer apply
:sumber
Bagaimana dengan menggunakan subquery (ini bekerja untuk saya di Mysql)?
sumber
HAVING berfungsi di MySQL sesuai dengan dokumentasi:
sumber
Anda bisa merujuk ke alias kolom tetapi Anda harus mendefinisikannya menggunakan
CROSS/OUTER APPLY
:Demo DBFiddle
Pro:
WHERE/GROUP BY/ORDER BY
sumber
sql-server
dant-sql
:)Datang ke sini mencari sesuatu yang mirip dengan itu, tapi dengan KASUS sebuah KAPAN, dan berakhir dengan menggunakan tempat seperti ini:
WHERE (CASE WHEN COLUMN1=COLUMN2 THEN '1' ELSE '0' END) = 0
mungkin Anda bisa menggunakanDATEDIFF
dalamWHERE
langsung. Sesuatu seperti:sumber