SUBSTR 純量函數

SUBSTR 函數會傳回字串的子字串。

Read syntax diagramSkip visual syntax diagramSUBSTR(string, start,length)

綱目是 SYSIBM。

字串
輸入表示式,指定要從中衍生子字串的字串。 表示式必須傳回內建字串、數值、布林值或日期時間值的值。 如果值不是字串,則在評估函數之前會隱含地強制轉型為 VARCHAR。 此表示式的任何數字 (零或多個) 連續字串單位構成此表示式的子字串。
開始
指定相對於輸入表示式開頭的位置,要從中計算子字串的表示式。 例如:
  • 位置 1 是輸入表示式的第一個字串單位。 陳述式 SUBSTR('abcd',1,2) 會傳回 'ab'
  • 位置 2 是位置 1 右側的一個位置。 陳述式 SUBSTR('abcd',2,2) 會傳回 'bc'
表示式必須傳回內建數值、CHAR、VARCHAR、GRAPHIC 或 VARGRAPHIC 值。 如果值不是 INTEGER 類型,則在評估函數之前會隱含地強制轉型為 INTEGER。
長度
指定結果長度的表示式。 如果指定的話,表示式必須傳回內建數值、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 函數的結果類型和長度取決於其輸入的類型和屬性。

表 1. SUBSTR 結果的資料類型和長度
字串引數資料類型 長度引數 結果資料類型
CHAR (A) constant (<n)
If the units of are:
  • OCTETS , n= 256
  • CODEUNITS32, n= 64
CHAR (l)
CHAR (A) 未指定,但 start 引數是常數 CHAR (A-start+ 1)
CHAR (A) 不是常數 VARCHAR (A)
VARCHAR (A) constant (<n)
If the units of are:
  • OCTETS , n= 256
  • CODEUNITS32, n= 64
CHAR (l)
VARCHAR (A) constant (分鐘<<n)
If the units of are:
  • OCTETS , m= 256 且 n= 32673
  • CODEUNITS32, m= 63 且 n= 8169
VARCHAR (l)
VARCHAR (A) 不是常數或未指定 VARCHAR (A)
CLOB (A) 常數 (l) CLOB (l)
CLOB (A) 不是常數或未指定 CLOB (A)
GRAPHIC (A) constant (<n)
If the units of are:
  • double-bytes 或 CODEUNITS16, n= 128
  • CODEUNITS32, n= 64
GRAPHIC (l)
GRAPHIC (A) 未指定,但 start 引數是常數 GRAPHIC (A-start+ 1)
GRAPHIC (A) 不是常數 VARGRAPHIC (A)
VARGRAPHIC (A) constant (<n)
If the units of are:
  • double-bytes 或 CODEUNITS16, n= 128
  • CODEUNITS32, n= 64
GRAPHIC (l)
VARGRAPHIC (A) constant (分鐘<<n)
If the units of are:
  • double-bytes or CODEUNITS16, m= 127 and n= 16337
  • CODEUNITS32, m= 63 且 n= 8169
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 中, stringstartlength 可以由參數標記代表。 如果將參數標記用於 string,則運算元的資料類型將是 VARCHAR ,且運算元將可為空值。
  • 雖然在先前提及的結果定義中未明確指出,但語意暗示如果 字串 是混合單位元組和多位元組字串,則結果可能包含多位元組字元的片段,視 startlength的值而定。 例如,結果可能以多位元組字元的第二個位元組開始,或以多位元組字元的第一個位元組結束。 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' 開頭的所有列。
       SELECT * FROM PROJECT
         WHERE SUBSTR(PROJNAME,1,10) = 'OPERATION '
    需要常數尾端的空格,才能排除 'OPERATIONAL' 之類的單字。