DB2 字串串聯支援兩種方式:雙管線符 ||(ANSI SQL 標準,與 Oracle 相容)與 CONCAT() 函數。兩者在參數數量、型別轉換、巢狀使用上有顯著差異,選錯方式會導致語法錯誤或執行失敗。
語法直觀、支援任意多字串串聯、自動進行隱含型別轉換。
SELECT '工號為' || FNumber || '的員工姓名為' || FName
FROM T_Employee
WHERE FName IS NOT NULL;
FNumber、FName 為非字串型別(如 INTEGER、DECIMAL)時,DB2 會自動轉為字串'A' || 'B' || 'C' || col1 || col2SELECT CONCAT('工號:', FNumber) FROM T_Employee;
CONCAT(str1, str2),不支援三個以上參數
-- 錯誤:參數過多
SELECT CONCAT('工號為', FNumber, '的員工姓名為', FName) FROM T_Employee;-- 錯誤:FAge 為數值型別
SELECT CONCAT('年齡:', FAge) FROM T_Employee;
-- SQL0440N: 未找到類型為 FUNCTION 命名為 CONCAT 且具有兼容自變量的已授權例程
需自行轉型:CONCAT('年齡:', CAST(FAge AS VARCHAR(10)))-- 正確寫法:巢狀 CONCAT
SELECT CONCAT(CONCAT(CONCAT('工號為', FNumber), '的員工姓名為'), FName)
FROM T_Employee
WHERE FName IS NOT NULL;| 特性 | DB2 | Oracle | MySQL | SQL Server |
|---|---|---|---|---|
| || 操作符 | ✅ 支援 | ✅ 支援 | ❌ (邏輯 OR) | ❌ (需 SET CONCAT_NULL_YIELDS_NULL) |
| CONCAT() 參數數 | 2 個 | 2 個 | N 個 ✅ | 2 個 (或用 +) |
| 隱含型別轉換 | || ✅ / CONCAT ❌ | ✅ | ✅ | + 操作符 ✅ |
| NULL 處理 | || 任一為 NULL 結果為 NULL | 同左 | CONCAT 忽略 NULL | + 任一為 NULL 結果為 NULL |
||:語法簡潔、自動型別轉換、無參數數量限制CONCAT()CONCAT() 時,務必對非字串欄位显式 CASTCOALESCE(col, '') 或 IFNULL(col, '')SELECT 'A' || NULL || 'C' FROM SYSIBM.SYSDUMMY1; -- 結果:NULL
SELECT CONCAT('A', NULL) FROM SYSIBM.SYSDUMMY1; -- 結果:NULL
-- 若需忽略 NULL 視為空字串:
SELECT 'A' || COALESCE(NULL, '') || 'C' FROM SYSIBM.SYSDUMMY1; -- 結果:'AC'