2020年6月3日 星期三

[字串函數]字串出現位置

字串(str)中搜尋特定子字串(set)所出現位置。

指令說明:
ORACLE: 提供INSTRREGEXP_INSTR函數,由於REGEXP_INSTR相對複雜,將撰寫專文說明
MSSQL: 提供CHARINDEX另提供具有『類似』正規表示式之PATINDEX函數,後續再行探討。

INSTR/CHARINDEX指令比較:
字串(str)中搜尋特定的子字串(set)所出現位置,兩個資料庫常用函數說明/比較如下:
ORACLE
MSSQL
語法
INSTR(strset [, i [, n]])
CHARINDEX(setstr [, i] )
起始位置(i)
ü (選擇性參數,搜尋起始位置,預設為1)
ü(選擇性參數,搜尋起始位置,預設為1)
起始位置(i)-負值
ü (代表字尾起算,由右至左)
û
出現次數(n)
ü (可指定第n次出現位置,預設為第一次)
û
注意: 字串(str)中搜尋特定的子字串(set)所出現位置,此兩個主要且必要參數。兩種資料庫順序不同
-    起始位置(i
兩者均可選擇指定搜尋起始位置(i),如忽略則採用預設值1ORACLE允許起始位置為負值,代表由右向左搜尋。
-    出現次數(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 (第一個數字位置)

沒有留言:

張貼留言