SQL应该永远不会返回任何东西,但确实如此

时间:2012-08-15 16:15:19

标签: sql

我遇到了以下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)"令我感到困惑。取决于操作顺序的实施,它应始终产生0A.NUM_FIELD / 2

SQL如何仍然从此视图返回记录?如果它总是导致原始值的一半,为什么会这样? (这是一个交付的SQL包)

3 个答案:

答案 0 :(得分:7)

可能是整数除法,因此奇数NUM_FIELD将少一个。

MSDN说:

  

如果整数被除数除以整数除数,则结果为   截断结果的任何小数部分的整数。

答案 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)

然后执行它,你会得到什么结果?