我遇到的情况是我在大量行上进行计算,如果能避开条件语句,我可以真正提高性能。
我需要的是给定的正,零或负整数我想分别得到结果1,0,-1。
所以,如果我col/ABS(col)
,我会得到1为正数,-1为负数,但当然如果col
等于0,那么我将得到一个错误。我不能得到错误。
这看起来很简单,但我不能把它放在前面。
答案 0 :(得分:5)
假设有两个补码的32位整数,或者一个补码而没有负零担心,那么以下方法效果很好:
(x>>31) - (-x>>31);
将31
替换为63
以获取64位整数,依此类推。
答案 1 :(得分:2)
col/max(1, abs(col))
丑陋但有效。对于整数,就是这样。对于没有明确定义的最小正值的浮点值,除非语言允许您将其视为位序列,否则您将卡住,然后您可以对符号标记执行相同操作有意义的。
这是否有助于优化任何事情,这是值得商榷的。这肯定会让事情变得更难阅读。
答案 2 :(得分:0)
我在SSAS表格模型中执行此操作,该模型没有像@ bizclop的答案那样具有MAX功能(这有助于许多其他应用程序,例如EXCEL)。
我最终做了以下内容,其灵感来自于接受的答案:
ROUND([col] / (ABS([col]) + 1), 0)
这最终使我的查询时间显着缩短(40%)而不是IF([col] <> 0, [col]/ABS([col], 0)
。