數值型欄位 (NUMBER/BINARY_FLOAT) 經由用戶端工具或隱含轉換顯示時,小於 1 的小數會遺失前導零:
SELECT 0.35 FROM dual; -- 顯示 .35
SELECT .001 FROM dual; -- 顯示 .001
TM (Text Minimum) 省略前導零| 元素 | 說明 | 範例 |
|---|---|---|
| 9 | 數字位數,前導空白 | 9999 → ␣␣12 |
| 0 | 數字位數,前導零 | 0000 → 0012 |
| . | 小數點 | 99.99 |
| D | 區域小數點 (NLS) | 99D99 |
| G | 區域千分位 (NLS) | 9G999 |
| C | 區域貨幣符號 | C999 |
| L | 本地貨幣符號 | L999 |
| FM | Fill Mode - 移除前後空白 | FM99.99 |
| PR | 負數用角括號 | 999PR → <100> |
| EEEE | 科學記號 | 9.99EEEE |
-- 固定 2 位小數,保留前導零
TO_CHAR(0.35, 'FM9999999990.00') -- '0.35'
TO_CHAR(1234.5, 'FM9999999990.00') -- '1234.50'
-- 貨幣格式 (含千分位、貨幣符號)
TO_CHAR(1234567.89, 'FML999G999G999D00') -- 'NT$1,234,567.89' (依 NLS)
-- 百分比
TO_CHAR(0.1234, 'FM999.99') || '%' -- '12.34%'
-- 科學記號
TO_CHAR(0.000123, 'FM9.99EEEE') -- '1.23E-04'
-- 前導零補齊 6 位
TO_CHAR(42, 'FM000000') -- '000042'
WITH tmp1 AS (
SELECT 1 AS a, 2 AS b FROM dual UNION ALL
SELECT 1, 3 FROM dual UNION ALL
SELECT 1, 4 FROM dual
),
tmp2 AS (
SELECT 1 AS a, 2 AS b FROM dual UNION ALL
SELECT 1, 3 FROM dual UNION ALL
SELECT 2, 4 FROM dual
)
SELECT t1.*, t2.*
FROM tmp1 t1 JOIN tmp2 t2 ON t1.a = t2.a;
優點:可讀性高、避免重複子查詢、優化器可選擇 Materialize/Inline。
| 工具 | 設定方式 |
|---|---|
| SQL*Plus | SET NUMFORMAT "999,999.99" 或 COL col FORMAT ... |
| SQL Developer | Tools → Preferences → Database → NLS → Numeric Characters |
| JDBC | ResultSet.getString() 依 NLS;建議用 getBigDecimal() 自行格式化 |
| ODP.NET | OracleNumber.ToString(format) 或 DataSet 欄位 FormatString |
NUMBER(p,s) 明確精度