SUBSTR 純量函數
SUBSTR 函數會傳回字串的子字串。
綱目是 SYSIBM。
- 字串
- 輸入表示式,指定要從中衍生子字串的字串。 表示式必須傳回內建字串、數值、布林值或日期時間值的值。 如果值不是字串,則在評估函數之前會隱含地強制轉型為 VARCHAR。 此表示式的任何數字 (零或多個) 連續字串單位構成此表示式的子字串。 開始
- 指定相對於輸入表示式開頭的位置,要從中計算子字串的表示式。 例如:
- 位置 1 是輸入表示式的第一個字串單位。 陳述式
SUBSTR('abcd',1,2)會傳回'ab'。 - 位置 2 是位置 1 右側的一個位置。 陳述式
SUBSTR('abcd',2,2)會傳回'bc'。
長度 - 位置 1 是輸入表示式的第一個字串單位。 陳述式
- 指定結果長度的表示式。 如果指定的話,表示式必須傳回內建數值、CHAR、VARCHAR、GRAPHIC 或 VARGRAPHIC 資料類型的值。 如果值不是 INTEGER 類型,則在評估函數之前會隱含地強制轉型為 INTEGER。 整數值必須在 0 到 n的範圍內,其中 n 等於 ( 弦 以字串單位的長度屬性)- 開始 + 1 (SQLSTATE 22011 ,如果超出範圍)。
如果明確指定 length ,則 string 實際上會在右側填補必要的空白字元 (單位元組代表字串; 雙位元組代表圖形字串) 或十六進位零字元 (代表二進位字串) ,以便 指定的子字串存在。 預設長度是從 開始 指定的字串單位到 弦的最後一個 字串單位 的 字串單位 數目。 不過,如果 string 是長度小於 start的可變長度字串,則預設值是零,結果是空字串。 在資料庫字碼頁的環境定義中,必須將它指定為 字串單位數 ,而不是應用程式字碼頁。 (例如,資料類型為 VARCHAR (18) 且值為 'MCNIGHT' 的直欄 NAME 將產生具有
SUBSTR(NAME,10)的空字串)。如果 string 是:- 固定長度字串,預設長度為
LENGTH(string) - start + 1 - 可變長度字串,預設長度為零或
LENGTH(string) - start + 1(以較大者為準)。
- 固定長度字串,預設長度為
結果
如果 string 是字串,則結果會是以字碼頁 及字串單位 代表其第一個引數的字串。 如果它是二進位字串,則結果會是二進位字串。 如果它是圖形字串,則結果會以其第一個引數的字碼頁 及字串單位 表示。 如果第一個引數是主變數,不是二進位字串,也不是 FOR BIT DATA 字串,則結果的字碼頁是資料庫字碼頁。 如果 SUBSTR 函數的任何引數可以是空值,則結果可以是空值; 如果任何引數是空值,則結果是空值。
表 1 顯示 SUBSTR 函數的結果類型和長度取決於其輸入的類型和屬性。
| 字串引數資料類型 | 長度引數 | 結果資料類型 |
|---|---|---|
| CHAR (A) | constant (我<n) If the units of 弦 are:
|
CHAR (l) |
| CHAR (A) | 未指定,但 start 引數是常數 | CHAR (A-start+ 1) |
| CHAR (A) | 不是常數 | VARCHAR (A) |
| VARCHAR (A) | constant (我<n) If the units of 弦 are:
|
CHAR (l) |
| VARCHAR (A) | constant (分鐘<我<n) If the units of 弦 are:
|
VARCHAR (l) |
| VARCHAR (A) | 不是常數或未指定 | VARCHAR (A) |
| CLOB (A) | 常數 (l) | CLOB (l) |
| CLOB (A) | 不是常數或未指定 | CLOB (A) |
| GRAPHIC (A) | constant (我<n) If the units of 弦 are:
|
GRAPHIC (l) |
| GRAPHIC (A) | 未指定,但 start 引數是常數 | GRAPHIC (A-start+ 1) |
| GRAPHIC (A) | 不是常數 | VARGRAPHIC (A) |
| VARGRAPHIC (A) | constant (我<n) If the units of 弦 are:
|
GRAPHIC (l) |
| VARGRAPHIC (A) | constant (分鐘<我<n) If the units of 弦 are:
|
VARGRAPHIC (l) |
| VARGRAPHIC (A) | 不是常數 | VARGRAPHIC (A) |
| DBCLOB (A) | 常數 (l) | DBCLOB (l) |
| DBCLOB (A) | 不是常數或未指定 | DBCLOB (A) |
| BINARY (A) | constant (我<256) | BINARY (l) |
| BINARY (A) | 未指定,但 start 引數是常數 | BINARY (A-start+ 1) |
| BINARY (A) | 不是常數 | VARBINARY (A) |
| VARBINARY (A) | constant (我<256) | BINARY (l) |
| VARBINARY (A) | constant (255<我<32673) | VARBINARY (l) |
| VARBINARY (A) | 不是常數或未指定 | VARBINARY (A) |
| BLOB (A) | 常數 (l) | BLOB (l) |
| BLOB (A) | 不是常數或未指定 | BLOB (A) |
附註: 繼續支援 LONG VARCHAR 及 LONG VARGRAPHIC 資料類型,但已淘汰且不建議使用。
注意事項
- 在動態 SQL 中, string、 start及 length 可以由參數標記代表。 如果將參數標記用於 string,則運算元的資料類型將是 VARCHAR ,且運算元將可為空值。
- 雖然在先前提及的結果定義中未明確指出,但語意暗示如果 字串 是混合單位元組和多位元組字串,則結果可能包含多位元組字元的片段,視 start 和 length的值而定。 例如,結果可能以多位元組字元的第二個位元組開始,或以多位元組字元的第一個位元組結束。 SUBSTR 函數不會偵測這類片段,也不會提供任何特殊處理程序。
範例
- 範例 1: 假設主變數
NAME (VARCHAR(50))具有值'BLUE JAY':- 下列陳述式會傳回值
'BLUE':SUBSTR(:NAME,1,4) - 下列陳述式會傳回值
'JAY':SUBSTR(:NAME,6) - 下列陳述式會傳回值
'JA':SUBSTR(:NAME,6,2)
- 下列陳述式會傳回值
- 範例 2: 從 PROJECT 表格中選取專案名稱 (PROJNAME) 以單字 'OPERATION' 開頭的所有列。
需要常數尾端的空格,才能排除 'OPERATIONAL' 之類的單字。SELECT * FROM PROJECT WHERE SUBSTR(PROJNAME,1,10) = 'OPERATION '
