Pendaraban Progresif SQL Hilang: Mengapa?
Ketiadaan pengendali pendaraban agregat khusus dalam SQL standard adalah perkara yang kerap dibincangkan. Walaupun pengendali sedemikian akan memudahkan pengiraan hasil darab nilai lajur, pengecualiannya dibenarkan oleh beberapa faktor.
Kebimbangan utama ialah potensi limpahan data. Pendaraban, terutamanya merentas set data yang besar, boleh menjana hasil dengan cepat melebihi kapasiti jenis data SQL terbesar sekalipun.
Selain itu, keperluan praktikal untuk pengendali yang berdedikasi agak rendah. Pendekatan alternatif, seperti menggunakan fungsi PRODUCT
(jika ada) atau melakukan pendaraban individu dalam subkueri, mudah mencapai hasil yang sama.
Pendekatan Alternatif kepada Pendaraban Progresif
Walaupun operator pendaraban langsung tiada, beberapa penyelesaian berkesan meniru fungsinya. Sistem pangkalan data popular seperti Oracle, MSSQL dan MySQL menyediakan fungsi matematik untuk mencapai ini:
EXP(SUM(LN(column)))
atau POWER(N,SUM(LOG(column, N)))
EXP(SUM(LOG(column)))
atau POWER(N,SUM(LOG(column)/LOG(N)))
EXP(SUM(LOG(column)))
atau POW(N,SUM(LOG(N,column)))
Kaedah ini memanfaatkan sifat logaritma dan eksponen untuk mengira hasil darab: jumlah logaritma adalah bersamaan dengan logaritma hasil darab dan eksponen membalikkan logaritma.
Contoh Ilustrasi
Pertimbangkan data sampel ini:
Column |
---|
1 |
2 |
4 |
8 |
Menggunakan penyelesaian Oracle:
<code class="language-sql">EXP(SUM(LN(Column)))</code>
Hasilnya dengan betul menghasilkan 64, hasil darab nilai lajur.
Mengendalikan Nombor Negatif
Adalah penting untuk ambil perhatian bahawa pendekatan logaritma ini sememangnya tidak mengendalikan nombor negatif. Untuk menampung nilai negatif, pengiraan yang lebih kompleks diperlukan. Berikut ialah contoh menggunakan SQL Server untuk menangani perkara ini:
<code class="language-sql">CASE WHEN MIN(ABS(data)) = 0 THEN 0 ELSE EXP(SUM(LOG(ABS(NULLIF(data, 0))))) * ROUND(0.5 - COUNT(NULLIF(SIGN(SIGN(data) + 0.5), 1)) % 2, 0) END</code>
Atas ialah kandungan terperinci Mengapa Tidak Terdapat Operator Pendaraban Progresif Terbina dalam dalam SQL?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!