首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> DB2 資料庫 >> DB2 教學

DB2 字串串聯完整指南:|| 操作符與 CONCAT 函數差異詳解

     編輯:DB2 教學

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 || col2
  • 符合 ANSI SQL 標準,可移植性佳

方式二:CONCAT() 函數(限制較多)

基本用法(僅兩個參數)

SELECT CONCAT('工號:', FNumber) FROM T_Employee;

三大限制

  1. 僅支援兩個參數:CONCAT(str1, str2),不支援三個以上參數
    -- 錯誤:參數過多
    SELECT CONCAT('工號為', FNumber, '的員工姓名為', FName) FROM T_Employee;
  2. 不進行隱含型別轉換:參數必須皆為字串型別,否則報錯:
    -- 錯誤:FAge 為數值型別
    SELECT CONCAT('年齡:', FAge) FROM T_Employee;
    -- SQL0440N: 未找到類型為 FUNCTION 命名為 CONCAT 且具有兼容自變量的已授權例程
    需自行轉型:CONCAT('年齡:', CAST(FAge AS VARCHAR(10)))
  3. 多字串需巢狀嵌套:
    -- 正確寫法:巢狀 CONCAT
    SELECT CONCAT(CONCAT(CONCAT('工號為', FNumber), '的員工姓名為'), FName)
      FROM T_Employee
     WHERE FName IS NOT NULL;

跨資料庫差異對照

特性DB2OracleMySQLSQL Server
|| 操作符✅ 支援✅ 支援❌ (邏輯 OR)❌ (需 SET CONCAT_NULL_YIELDS_NULL)
CONCAT() 參數數2 個2 個N 個 ✅2 個 (或用 +)
隱含型別轉換|| ✅ / CONCAT ❌✅✅+ 操作符 ✅
NULL 處理|| 任一為 NULL 結果為 NULL同左CONCAT 忽略 NULL+ 任一為 NULL 結果為 NULL

最佳實踐建議

  • 優先使用 ||:語法簡潔、自動型別轉換、無參數數量限制
  • 僅在需相容舊版 DB2 或特定 SQL 標準要求時使用 CONCAT()
  • 使用 CONCAT() 時,務必對非字串欄位显式 CAST
  • 處理 NULL 值需求時,可搭配 COALESCE(col, '') 或 IFNULL(col, '')

NULL 值行為補充

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'
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved