SQL 缺少漸進乘法:為什麼?
標準 SQL 缺乏專用聚合乘法運算子是一個經常討論的問題。雖然這樣的運算子可以簡化列值乘積的計算,但排除它是有幾個因素的。
一個主要問題是潛在的資料溢出。 乘法,尤其是跨大型資料集的乘法,可以快速產生超出最大 SQL 資料類型容量的結果。
而且,對專職操作員的實際需求相對較低。 替代方法,例如使用 PRODUCT
函數(如果可用)或在子查詢中執行單獨的乘法,很容易實現相同的結果。
漸進乘法的替代方法
雖然缺少直接乘法運算符,但有幾種解決方法有效地模仿了其功能。 Oracle、MSSQL 和 MySQL 等流行的資料庫系統提供了數學函式來完成此任務:
EXP(SUM(LN(column)))
或 POWER(N,SUM(LOG(column, N)))
EXP(SUM(LOG(column)))
或 POWER(N,SUM(LOG(column)/LOG(N)))
EXP(SUM(LOG(column)))
或 POW(N,SUM(LOG(N,column)))
這些方法利用對數和指數屬性來計算乘積:對數總和等於乘積的對數,而求冪則反轉對數。
說明性範例
考慮這個範例資料:
Column |
---|
1 |
2 |
4 |
8 |
應用 Oracle 解決方法:
<code class="language-sql">EXP(SUM(LN(Column)))</code>
結果正確地得出 64,即列值的乘積。
處理負數
值得注意的是,這些對數方法本身並不會處理負數。 為了適應負值,需要更複雜的計算。 以下是使用 SQL Server 解決此問題的範例:
<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>
以上是為什麼 SQL 中沒有內建漸進乘法運算子?的詳細內容。更多資訊請關注PHP中文網其他相關文章!