字串(str)中搜尋特定子字串(set)所出現位置。
指令說明:
ORACLE: 提供INSTR及REGEXP_INSTR函數,由於REGEXP_INSTR相對複雜,將撰寫專文說明。
MSSQL: 提供CHARINDEX及另提供具有『類似』正規表示式之PATINDEX函數,後續再行探討。
INSTR/CHARINDEX指令比較:
字串(str)中搜尋特定的子字串(set)所出現位置,兩個資料庫常用函數說明/比較如下:
ORACLE
|
MSSQL
|
|
語法
|
INSTR(str, set [, i [, n]])
|
CHARINDEX(set, str [, i]
)
|
起始位置(i)
|
ü (選擇性參數,搜尋起始位置,預設為1)
|
ü(選擇性參數,搜尋起始位置,預設為1)
|
起始位置(i)-負值
|
ü (代表字尾起算,由右至左)
|
û
|
出現次數(n)
|
ü (可指定第n次出現位置,預設為第一次)
|
û
|
注意: 字串(str)中搜尋特定的子字串(set)所出現位置,此兩個主要且必要參數。兩種資料庫之順序不同。
-
起始位置(i)
兩者均可選擇指定搜尋起始位置(i),如忽略則採用預設值1,ORACLE允許起始位置為負值,代表由右向左搜尋。
-
出現次數(n次)
ORACLE可設定出現(Occurrence)之第n次之位置。子字串(set)可能於字串(str)中出現多次,此選項可指定搜尋出第幾次的位置。
範例:
ORACLE
|
MSSQL
|
|
找出字元A位置
2
|
SELECT INSTR('BANANA', 'A')
FROM DUAL
|
SELECT CHARINDEX('A', 'BANANA')
|
從位置3起找出字元A位置
4
|
SELECT INSTR('BANANA', 'A', 3)
FROM DUAL
|
SELECT CHARINDEX('A', 'BANANA', 3)
|
從位置1起字元A
出現第2次位置
4
|
SELECT INSTR('BANANA', 'A',
1, 2)
FROM DUAL
|
無對應
|
從字尾找出字元N位置
5
|
SELECT INSTR('BANANA', 'N', -1)
FROM DUAL
|
SELECT LEN('BANANA')
- CHARINDEX ('N', REVERSE('BANANA'))+1
|
MSSQL: PATINDEX函數
MSSQL目前可於LIKE指令及PATINDEX函數中,應用類似正規表示式(Regular Expression:REGEXP)功能於字串搜尋(篩選)比對,PATINDEX函數可於字串中以指定模式搜尋,傳回第一次出現符合模式之起始位置;如無則傳回0。後續再撰文探討。
PATINDEX('%pattern%', expr)
|
SELECT PATINDEX('%[0-9]%', 'A123456789')
----------------
結果: 2 (第一個數字位置)
沒有留言:
張貼留言