Meninjau pertanyaan ini sepertinya banyak pekerjaan yang seharusnya tidak diperlukan. Mereka mencoba memperluas rentang dengan tanggal. Di database lain, Anda hanya akan menggunakan greatest
dan least
..
least(extendDate,min), greatest(extendDate,max)
Ketika saya mencoba menggunakan ini, saya mengerti
'least' is not a recognized built-in function name.
'greatest' is not a recognized built-in function name.
Itu akan mencakup ekstensi di kedua arah.
Untuk keperluan pertanyaan, Anda masih harus melakukan penggantian rentang eksklusif.
Saya hanya ingin tahu bagaimana pengguna SQL Server menerapkan pola kueri untuk meniru least
dan greatest
fungsionalitas.
- PostgreSQL
GREATEST
/LEAST
- MySQL
GREATEST
/LEAST
- MariaDB
GREATEST
LEAST
- DB2
GREATEST
LEAST
- Peramal
GREATEST
LEAST
Apakah Anda membuka gulungan syarat ke dalam CASE
pernyataan atau apakah ada ekstensi, add-on pihak ketiga, atau lisensi dari Microsoft yang memungkinkan fungsi ini?
sql-server
t-sql
feature-comparison
Evan Carroll
sumber
sumber
LEAST
/GREATEST
fungsi - hampir semua pesaing RDBMS memiliki setidaknya yang setara. Satu-satunya pengecualian yang dapat saya temukan adalah Sybase, tetapi itu juga telah dihentikan selama bertahun-tahun pada saat ini.Jawaban:
Salah satu metode umum adalah dengan menggunakan
VALUES
klausa, danCROSS APPLY
dua kolom alias sebagai satu kolom, lalu dapatkanMIN
danMAX
masing-masing.Ada cara lain untuk menulisnya, misalnya menggunakan
UNION ALL
Namun, rencana kueri yang dihasilkan tampaknya sama.
sumber
Anda juga bisa meletakkan nilai-nilai sebaris dalam subquery. Seperti ini:
sumber
Ini akan menjadi awal yang baik -
sumber
Setara dengan LEAST:
Setara TERBESAR:
sumber
least(5,6,7,8,9)
?Saya membuat fungsi yang ditentukan pengguna, misalnya
Meskipun mungkin berhasil dalam kasus-kasus sederhana, namun ada beberapa masalah dengan pendekatan ini:
least
operator di Oracle dan MySQL, tetapi berbeda dari Postgres. Tapi lapis baja terhadap nol ini membuatnya lebih verbose (jika Anda tahu mereka tidak akan menjadi nol, sebuah datarancase when @a <= @b then @a else @b end
akan bekerja).Secara keseluruhan mungkin lebih baik untuk menulis
case
pernyataan itu secara langsung jika kinerja penting. Saya bahkan terpaksa membuatcase
pernyataan bersarang di sisi klien ketika ada beberapa nilai untuk dibandingkan.sumber
Saya bermaksud untuk menambahkan komentar pada jawaban @ ed-avis, tetapi tidak dapat melakukannya, karena kurangnya reputasi, jadi memposting ini sebagai ekstensi untuk jawabannya.
Saya telah menghilangkan kerugian dari "Mengganggu Anda harus membuat fungsi terpisah untuk setiap tipe data." Menggunakan SQL_VARIANT .
Inilah implementasi saya:
Juga fungsi ini menangani NULL seperti versi postgresql.
Fungsi ini dapat ditambahkan ke DB untuk kenyamanan, tetapi 10 kali lebih lambat , daripada menggunakan bawaan
IIF
. Tes saya menunjukkan, bahwa fungsi tersebut dengan tipe yang tepat ( datetime ) berkinerja sama dengan versi sql_variant .PS Saya menjalankan beberapa tes pada data-set nilai 350k, dan tampaknya kinerjanya sama, sql_variant sedikit lebih cepat, tapi saya percaya itu hanya kegelisahan.
Tapi bagaimanapun juga versi IIF 10x kali lebih cepat !!!
Saya belum menguji inline
CASE WHEN
tetapi pada dasarnya untuk t-sql IIF sama dengan case , dan jika saya bisa dikonversi oleh optimizer ke case case.KESIMPULAN: Lebih cepat menggunakan IIF jika kinerja penting, tetapi untuk prototipe, atau jika kejelasan kode lebih dibutuhkan, dan tidak ada perhitungan besar yang terlibat, asalkan fungsi dapat digunakan.
sumber
iif(a<b, a, b)
adalah 10 kali lebih cepat dari fungsi yang ditentukan pengguna.IIF()
- lebih cepat daripada menggunakanCASE
ekspresi? Maksud saya adalah, bahwa karena Anda mengalami kesulitan dalam pengujian kinerja, Anda harus menguji semua metode / jawaban yang disarankan.