在商品管理、財務系統或報表需求中,常常需要判斷某個數值欄位是否含有小數點。例如:
- 商品售價是否為整數(整數才能套用某種折扣規則)
- 財務帳目中篩選出非整數金額以進行異常稽核
- 匯出 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,需確認欄位定義
- 處理財務數值時,建議使用
DECIMAL 或 NUMERIC 型別,避免浮點數精度問題
參考資料