Contents

SQL判斷快否有小數點

在商品管理、財務系統或報表需求中,常常需要判斷某個數值欄位是否含有小數點。例如:

  • 商品售價是否為整數(整數才能套用某種折扣規則)
  • 財務帳目中篩選出非整數金額以進行異常稽核
  • 匯出 Excel 時,整數與小數顯示格式不同

使用 CAST 轉型判斷

最常見的方法是將數值轉型成整數(INT),再與原始值比較。若兩者不相等,表示原值有小數部分。

查詢是否有小數點(CASE WHEN 版)

1
2
3
4
5
6
SELECT col1,
    CASE col1
        WHEN CAST(col1 AS INT) THEN '整數(無小數點)'
        ELSE '有小數點'
    END AS has_decimal
FROM 1

篩選出有小數點的資料

1
2
3
SELECT col1
FROM 1
WHERE col1 <> CAST(col1 AS INT)

MySQL 語法

MySQL 中可以使用 FLOOR()TRUNCATE() 來達到相同效果:

1
2
3
4
5
6
7
8
9
-- 使用 FLOOR 判斷
SELECT col1
FROM 1
WHERE col1 <> FLOOR(col1);

-- 使用 MOD 判斷(整數的 mod 1 = 0)
SELECT col1
FROM 1
WHERE MOD(col1, 1) <> 0;

SQL Server 語法

SQL Server 中除了 CAST 以外,也可以使用 FLOOR

1
2
3
4
5
6
7
8
9
-- 使用 CAST
SELECT col1
FROM 1
WHERE col1 <> CAST(col1 AS INT);

-- 使用 FLOOR
SELECT col1
FROM 1
WHERE col1 <> FLOOR(col1);

其他替代方法

使用字串判斷(適合任何資料庫)

1
2
3
4
-- 判斷字串中是否有小數點符號
SELECT col1
FROM 1
WHERE CHARINDEX('.', CAST(col1 AS VARCHAR)) > 0;

使用 PostgreSQL

1
2
3
SELECT col1
FROM 1
WHERE col1 <> TRUNC(col1);

注意事項

  • CAST(col1 AS INT) 會直接截斷小數部分,不會四捨五入
  • 若欄位本身是 DECIMAL(10,0) 型別,查詢時 <> 比較可能永遠為 false,需確認欄位定義
  • 處理財務數值時,建議使用 DECIMALNUMERIC 型別,避免浮點數精度問題

參考資料