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中文网其他相关文章!