我遇到了以下SQL语句:
SELECT A.NAME
FROM THE_TABLE A
WHERE A.NAME LIKE '%JOHN%DOE%'
AND ((A.NUM_FIELD/1) - (A.NUM_FIELD/2)*2 <> 0)
最后一个条件,"((A.NUM_FIELD/1) - (A.NUM_FIELD/2)*2 <> 0)"
令我感到困惑。取决于操作顺序的实施,它应始终产生0
或A.NUM_FIELD / 2
。
SQL如何仍然从此视图返回记录?如果它总是导致原始值的一半,为什么会这样? (这是一个交付的SQL包)
答案 0 :(得分:7)
答案 1 :(得分:2)
如果NUM_FIELD是一个整数,那么奇数 - 然后
(A.NUM_FIELD/1) - (A.NUM_FIELD/2)*2
等于一个
答案 2 :(得分:1)
这是什么SQL实现?
如上所述,
(x/1) - (x/2)*2
相当于
X - (2*(x/2))
,如果正在执行整数除法,则取决于该值是偶数还是奇数,产生0或1:
x x/2 2*(x/2) x-(2*(x/2))
- --- ------- -----------
0 0 0 0
1 0 0 1
2 1 2 0
3 1 2 1
4 2 4 0
...
如果是这样,它似乎是检查奇数/偶数值的奇怪方法,特别是因为我所知道的大多数SQL实现都支持 modulo 运算符或函数,{{1 }或x % y
。
看似无关的除法1让我觉得有问题的专栏可能是浮点数。也许编码查询的人试图检查浮点列的低位比特中的抖动或模糊性?
如果您修改了查询以返回计算的所有中间值:
mod(x,y)
然后执行它,你会得到什么结果?