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)"は、私を困惑させるものです。演算の優先順位の実装に応じて、常に0またはになりA.NUM_FIELD / 2ます。

SQLはこのビューからレコードをどのように返しますか?常に元の値の半分になる場合、なぜそれを持っているのですか?(これは提供されたSQLパッケージです)

4

3 に答える 3

7

おそらく整数除算なので、奇数NUM_FIELDは1つ少なくなります。

MSDNによると:

整数被除数を整数除数で割ると、結果は結果の小数部分が切り捨てられた整数になります。

于 2012-08-15T16:20:39.207 に答える
2

NUM_FIELD が整数で奇数の場合

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

は 1 に等しい

于 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 に答える