原文標題為「DB2 字串函數與用法演示(2)」,但內容混雜了 SQL Server 函數(如 QUOTENAME、REPLICATE、STUFF、DATEADD、DATEDIFF、GETDATE 等),這些在 DB2 中不存在。本文重新整理,保留真正屬於 DB2 的函數,補正錯誤,並補充 DB2 對應語法,提供正確的參考依據。
語法: REPLACE(源字串, 搜尋字串, 替換字串)
說明: 將源字串中所有出現的搜尋字串替換為替換字串。
SELECT REPLACE('ROMANND', 'NND', 'CCB') FROM SYSIBM.SYSDUMMY1; -- 'ROMACCB'
語法: SPACE(長度)
說明: 返回指定長度的空白字串。長度為負值返回 NULL。
SELECT SPACE(10) FROM SYSIBM.SYSDUMMY1;
語法: SUBSTR(字串, 起始位置 [, 長度])
說明: 從位置 1 起算擷取。省略長度則擷取至結尾。SUBSTRING 為同義詞,支援標準 SQL FROM ... FOR ... 語法。
SELECT SUBSTR('CDNJFDJFJD', 5, 2) FROM SYSIBM.SYSDUMMY1; -- 'FD'
語法: INSERT(源字串, 起始位置, 長度, 插入字串)
說明: 刪除源字串從起始位置長度的字元,插入新字串。此為 DB2 原生函數,對應 SQL Server 的 STUFF。
語法: LOCATE(搜尋字串, 被搜尋字串 [, 起始位置])
POSSTR(被搜尋字串, 搜尋字串)
說明: 返回首次出現位置(從 1 起算),找不到返 0。注意兩者參數順序相反。
語法: REPEAT(字串, 次數)
說明: 返回字串重複 N 次的結果。對應 SQL Server REPLICATE。
語法: LEFT(字串, 長度)、RIGHT(字串, 長度)
語法: LTRIM(字串)、RTRIM(字串)、TRIM([BOTH|LEADING|TRAILING] [字元] FROM 字串)
說明: DB2 9.7+ 支援標準 TRIM,可指定修剪字元與方向。
標準寫法為 UPPER/LOWER。
CONCAT(a, b) 僅限兩引數;a || b || c 更彈性。
語法: CAST(運算式 AS 資料型別 [長度])
說明: ANSI SQL 標準,跨資料庫可攜性最佳。
SELECT CAST('123' AS INTEGER) FROM SYSIBM.SYSDUMMY1;
DB2 提供一系列型別專用函數,效能優於 CAST:
CHAR(expr)、VARCHAR(expr):轉字串DECIMAL(expr, p, s)、INTEGER(expr)、SMALLINT(expr)、BIGINT(expr)、DOUBLE(expr)、REAL(expr):轉數值DATE(expr)、TIME(expr)、TIMESTAMP(expr):轉日期時間BLOB(expr)、CLOB(expr)、DBCLOB(expr):轉大物件GRAPHIC(expr)、VARGRAPHIC(expr):轉圖形字串注意: DB2 無 CONVERT 函數。原文列出的 CONVERT、style 參數、MONEY、BIT、IMAGE、TEXT 等皆為 SQL Server 語法。遷移時請改用 CAST 或專用函數。
| 功能 | DB2 函數 | 備註 |
|---|---|---|
| 年份 | YEAR(date) | |
| 月份 | MONTH(date) | |
| 日期 | DAY(date) / DAYOFMONTH(date) | |
| 年度第幾天 | DAYOFYEAR(date) | |
| 星期幾(1-7,1=星期天) | DAYOFWEEK(date) | |
| 星期名稱 | DAYNAME(date) | |
| 月份名稱 | MONTHNAME(date) | |
| 季度 | QUARTER(date) | |
| 小時/分鐘/秒 | HOUR(time)/MINUTE(time)/SECOND(time) | |
| 微秒 | MICROSECOND(ts) |
date + 1 DAY、date - 3 MONTHS、timestamp + 2 HOURS 等標準語法。DAYS(date1) - DAYS(date2) 得天數差;TIMESTAMPDIFF(單位, ts1 - ts2) 得指定單位差值。CURRENT DATE、CURRENT TIME、CURRENT TIMESTAMP(特殊暫存器,非函數)GETDATE()、SYSDATE 等函數。DB2 無內建 DATENAME/DATEPART/TO_CHAR 風格格式化。常用做法:
VARCHAR_FORMAT(ts, 'YYYY-MM-DD HH24:MI:SS')(DB2 9.7+)YEAR、MONTH、DAY 等函數自行拼裝| SQL Server | DB2 對應寫法 |
|---|---|
DATEADD(unit, n, dt) | dt + n UNIT(如 CURRENT DATE + 5 DAYS) |
DATEDIFF(unit, dt1, dt2) | TIMESTAMPDIFF(unit, dt2 - dt1) 或 DAYS(dt2) - DAYS(dt1) |
DATENAME(unit, dt) | DAYNAME(dt)/MONTHNAME(dt) 等個別函數 |
DATEPART(unit, dt) | YEAR(dt)/MONTH(dt)/DAY(dt) 等個別函數 |
GETDATE() | CURRENT TIMESTAMP |
QUOTENAME(str, '[]') | 無內建,用 '[' || str || ']' 或應用層處理 |
REPLICATE(str, n) | REPEAT(str, n) |
REVERSE(str) | 無內建,需遞迴 CTE 或應用層實現 |
STUFF(str, start, len, ins) | INSERT(str, start, len, ins) |
DB2 函數體系與 SQL Server/Oracle 差異極大。開發與遷移時,切勿假設函數名稱相同即語法相同。請以官方文件為準,善用 SYSIBM.SYSDUMMY1 驗證語法,並建立專案專屬的函數對照表,避免上線後發現函數不存在或行為不符預期。