一、類型轉換函數
| 函數 | 語法 | 差異 | 示例 |
| CAST | `CAST(expr AS type)` | ANSI 標準、不可指定格式 | `CAST('3.14' AS DECIMAL(5,2))` |
| CONVERT | `CONVERT(type, expr [, style])` | SQL Server 專有、支援日期/數值格式 | `CONVERT(VARCHAR(10), GETDATE(), 120)` |
| TRY_CAST / TRY_CONVERT | 同 CAST/CONVERT | 轉換失敗返回 NULL 而不報錯 (SQL 2012+) | `TRY_CAST('abc' AS INT)` → NULL |
| PARSE | `PARSE(expr AS type USING culture)` | .NET 解析、文化相關 (SQL 2012+) | `PARSE('12/31/2023' AS DATE USING 'en-US')` |
二、空值處理函數
| 函數 | 語法 | 行為 | 示例 |
| COALESCE | `COALESCE(exp1, exp2, ..., expN)` | 返回首個非 NULL 參數 (標準、可多參數) | `COALESCE(Phone, Email, 'N/A')` |
| ISNULL | `ISNULL(exp, replacement)` | SQL Server 專有、雙參數、類型跟隨第一參數 | `ISNULL(Bonus, 0)` |
| NULLIF | `NULLIF(exp1, exp2)` | 相等返回 NULL,不等返回 exp1 | `NULLIF(Qty, 0)` 防除零 |
三、流程控制:CASE 表達式
-- 簡單 CASE (等值)
CASE @Grade
WHEN 'A' THEN '優秀'
WHEN 'B' THEN '良好'
ELSE '需努力'
END
-- 搜尋 CASE (布林表達式)
CASE
WHEN Score >= 90 THEN '優秀'
WHEN Score >= 60 THEN '及格'
ELSE '不及格'
END
- 順序求值,首匹配返回
- 所有分支返回類型必須兼容 (隱式轉換到最高優先級)
- 可嵌套、可用於 SELECT/WHERE/ORDER BY/GROUP BY/SET
四、SQL Server 獨有實用函數
| 函數 | 用途 | 示例 |
| NEWID() | 生成唯一標識符 (GUID) | 隨機排序 `ORDER BY NEWID()` |
| NEWSEQUENTIALID() | 生成有序 GUID (減少頁分裂) | `DEFAULT NEWSEQUENTIALID()` |
| ROW_NUMBER() | 窗口排名 | 分頁、去重、Top-N |
| GETDATE() / SYSDATETIME() | 當前日期時間 (低/高精度) | `SYSDATETIME()` 納秒精度 |
| EOMONTH() | 月末日期 (SQL 2012+) | `EOMONTH(GETDATE(), -1)` 上月尾 |
| FORMAT() | .NET 格式化 (SQL 2012+) | `FORMAT(GETDATE(), 'yyyy-MM-dd', 'zh-CN')` |
| STRING_AGG() | 字符串聚合 (SQL 2017+) | `STRING_AGG(Name, ',')` |
| TRANSLATE() | 字符級替換 (SQL 2017+) | `TRANSLATE('abc', 'abc', '123')` |
| CONCAT_WS() | 分隔符連接 (SQL 2017+) | `CONCAT_WS('-', Y, M, D)` |
實戰組合拳
-- 安全除法 + 空值處理 + 格式化
SELECT
ProductName,
FORMAT(ISNULL(Price, 0), 'C', 'zh-CN') AS PriceDisplay,
CASE
WHEN TRY_CAST(Qty AS INT) IS NULL THEN '數據異常'
WHEN Qty = 0 THEN '缺貨'
ELSE CAST(Amount / NULLIF(Qty, 0) AS DECIMAL(10,2))
END AS UnitPrice
FROM Products;