2

我遇到了以下 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)"让我感到困惑。根据操作顺序的实现,它应该总是导致0or A.NUM_FIELD / 2

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

4

3 回答 3

7

可能是整数除法,所以奇数NUM_FIELD会少一。

MSDN说:

如果整数被除数除以整数除数,则结果是一个整数,结果的任何小数部分都被截断。

于 2012-08-15T16:20:39.207 回答
2

如果 NUM_FIELD 是一个整数,并且是一个奇数,那么

(A.NUM_FIELD/1) - (A.NUM_FIELD/2)*2

等于一

于 2012-08-15T16:23:32.683 回答
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 实现都支持运算符或函数,要么x % y要么mod(x,y)

看似无关的除以 1 让我认为有问题的列可能是浮点数。也许编写查询代码的人正试图检查浮点列的低位中的抖动或模糊性?

如果您修改查询以返回计算的所有中间值:

SELECT A.NAME                    as Name      ,
       A.NUM_FIELD               as X         ,
       A.NUM_FIELD / 1           as X_over_1  ,
       A.NUM_FIELD / 2           as X_over_2  ,
       ( X.NUM_FIELD / 2 )
       * 2                       as 2x_over_2 ,
         ( A.NUM_FIELD / 1 )
       - ( A.NUM_FIELD / 2 ) * 2 as Delta ,
       case when ( ( A.NUM_FIELD / 1 ) - ( A.NUM_FIELD / 2 ) * 2 ) <> 0
       then 'return'
       else 'discard'
       end as Row_Status
FROM   THE_TABLE A
WHERE  A.NAME LIKE '%JOHN%DOE%'

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

于 2012-08-15T17:00:58.433 回答