【问题标题】:Condition inside function call in Sybase SQLSybase SQL 中函数调用内部的条件
【发布时间】:2014-12-17 06:21:51
【问题描述】:

我正在尝试在 Sybase 中使用 SQL 实现几何乘法。我的百分比范围从 -100 到 +infinity。由于 Sybase 中没有产品聚合,因此我使用 exp 和 log 方法的近似值。没有为 log(0) 定义日志,所以我必须捕获值 -100。

我想做类似的事情:

SELECT KEY, IF VALUE <= EXP(SUM(LOG(CASE WHEN VALUE <= -100 THEN 0 ELSE 1+VALUE / 100 END)))
FROM TABLE 
GROUP BY KEY

查询部分CASE WHEN VALUE &lt;= -100 THEN 0 ELSE 1+VALUE / 100 END 在函数外部有效,但在它出现的日志函数内部无效。

错误信息:关键字FROM附近的语法不正确。

知道如何解决这个问题吗?

【问题讨论】:

  • 你说log(0)没有定义,然后在VALUE &lt;= -100时尝试计算。这是故意的吗?
  • fwiw:看起来您正在选择两个值 - KEY 后跟一个乱码/不完整的“if”语句。我无权访问 Sybase 服务器(您使用的是 IQ 还是 ASE?)来测试,但如果 CASE 在 LOG() 中不起作用,则反转逻辑并将单独的 LOG() 放在两个分支中一个案例。
  • 如果你想让VALUE &lt;= -100 不参与求和,你应该让CASE 语句返回1,因为log(1)=0
  • 如果您要编辑问题中的示例代码,请考虑将其添加到问题的末尾,而不是更改初始代码。现在代码正下方的注释没有意义。
  • 是的,我开始更正这条线,我也想过同样的想法,所以我把它写回了错误的方式以供参考。

标签: sql sybase


【解决方案1】:

我应该在这之前先喝杯咖啡...谢谢你的帮助。

  1. IF VALUE &lt;= 根本不应该在那里。这是来自我做过的一个旧测试,但忘了删除它。
  2. LOG() 发错地方了。

正确答案如下:

SELECT KEY, EXP(SUM(CASE WHEN VALUE <= -100 THEN 0 ELSE LOG(1+VALUE / 100) END))
FROM TABLE 
GROUP BY KEY

编辑:实际上,由于该值以百分比为单位,因此以百分比获得最终结果可能更符合逻辑:

SELECT KEY, (EXP(SUM(CASE WHEN VALUE <= -100 THEN 0 ELSE LOG(1+VALUE / 100) END)) - 1) * 100
FROM TABLE 
GROUP BY KEY

【讨论】:

  • 这更有意义!我想知道获取布尔值会有什么帮助,但假设问题是函数本身的前身。
猜你喜欢
  • 1970-01-01
  • 2011-04-06
  • 1970-01-01
  • 2020-06-20
  • 1970-01-01
  • 1970-01-01
  • 2020-12-03
  • 1970-01-01
  • 2022-01-24
相关资源
最近更新 更多