B-Teck!

お仕事からゲームまで幅広く

【SQL/SQLServer】整数同士の割算の時、結果が必ず整数になってしまう

SQLServerで割り算を行った時、整数同士での割り算の場合は必ず結果が整数になってしまう理由が謎だったので調べた。

実行環境

問題

下記のSQLは1.5という結果が得られるような気がする、と思ってた。

SELECT
    3/2

思ってただけだった。
f:id:beatdjam:20160222232235p:plain

原因

/ (除算) (Transact-SQL)

戻り値の型
優先順位が高い引数のデータ型を返します。 詳細については、「データ型の優先順位 (Transact-SQL)」を参照してください。
整数型の dividend を整数型の divisor で除算すると、結果は小数部が切り捨てられた整数になります。

データ型の優先順位 (Transact-SQL)

演算子でデータ型が異なる 2 つの式を結合すると、データ型の優先順位の規則によって、優先順位の低いデータ型を優先順位の高いデータ型に変換することが指定されます。
暗黙的な変換がサポートされていない場合は、エラーが返されます。
両方のオペランド式が同じデータ型の場合は、演算の結果も同じデータ型になります。

回避方法

つまり、下記のようにデータ型の優先順位が整数型にならないように割り算を行う必要があるらしい。

--どちらかの数字に小数点以下をつける
SELECT
    3.0 / 2
SELECT    
    3   / 2.0

--型変換を行う
SELECT
    CONVERT(float, 3) / 2
SELECT
    3 / CONVERT(float, 2)

--小数を掛けて、整数型の演算ではなくする
SELECT
    1.0 * 3 / 2

f:id:beatdjam:20160222234924p:plain

注意

小数を掛ける方法では、計算の順序によって値が切り捨てられてしまうパターンがあるため注意

  • OKパターン
SELECT
    1.0 * 3 / 2 --1.5

1.0 * 3が先に計算されて3.0 / 2となるためOK

  • NGパターン
SELECT
    3 / 2 * 1.0 --1.0

3 / 2が先に計算されて1 * 1.0となるためNG

f:id:beatdjam:20160222235803p:plain