ORACLE字串擷取

2022-06-27 19:03:08 字數 2909 閱讀 3068

substr 函式:擷取字串

語法:substr(string,start, [length])

string:表示源字串,即要擷取的字串。

start:開始位置,從1開始查詢。如果start是負數,則從string字串末尾開始算起。

length:可選項,表示擷取字串長度。

示例:select substr('hello sql!', 1) from dual --擷取所有字串,返回'hello sql!'

select substr('hello sql!', 2) from dual --從第2個字元開始,擷取到末尾。返回'ello sql!'

select substr('hello sql!', -4) from dual --從倒數第4個字元開始,擷取到末尾。返回'sql!'

select substr('hello sql!', 3, 6) from dual --從第3個字元開始,擷取6個字元。返回'llo sq'

select substr('hello sql!', -4, 3) from dual --從倒數第4個字元開始,擷取3個字元。返回'sql'

instr 函式:返回子字串在源字串中的位置

語法:instr(string,child_string,[start],[show_time])

string:表示源字串。

child_string:子字串,即要查詢的字串。

start:可選項,開始位置,預設從1開始。如果為負數,則從右向左檢索。

show_time:可選項,表示子字串第幾次出現在源字串當中,預設第1次,負數則報錯。

示例:--表示從源字串'city_company_staff'中第1個字元開始查詢子字串'_'第1次出現的位置

select instr('city_company_staff', '_') from dual --返回5

--表示從源字串'city_company_staff'中第5個字元開始查詢子字串'_'第1次出現的位置

select instr('city_company_staff', '_', 5) from dual --返回5

--表示從源字串'city_company_staff'中第5個字元開始查詢子字串'_'第1次出現的位置

select instr('city_company_staff', '_', 5, 1) from dual --返回5

--表示從源字串'city_company_staff'中第3個字元開始查詢子字串'_'第2次出現的位置

select instr('city_company_staff', '_', 3, 2) from dual --返回13

--start引數為-1,從右向左檢索,查詢'_'字串在源字串中第1次出現的位置

select instr('city_company_staff', '_', -1, 1) from dual --返回13

--start引數為-6,從右向左檢索,查詢'_'字串在源字串中第2次出現的位置

select instr('city_company_staff', '_', -6, 2) from dual --返回5

substr 函式結合 instr 函式擷取字串

現有需求:資料查詢處理需要對code進行"拆分"

code命名規則類似:城市_所屬公司_員工職位_員工姓名

其中,城市、公司、職位、姓民字串長度不固定,由於字串長度不固定,只使用substr函式無法實現需求,需配合instr函式定位到字元'_'的位置,然後使用substr函式進行擷取。詳細見下面例子。

表資料如下:

列名:source_code

列值: bj_baidu_ceo_ly

列值:sh_boke_manager_lwx

列值:hrb_wm_cashier_oyzy

獲取城市:

select

substr (source_code, 1, instr (source_code, '_', 1, 1) - 1) as city

from

table_code_test

結果:解釋:此處擷取源字串source_code,從第1個字元開始,由於代表城市的code長度不固定,我們無法確定擷取幾個字元,所以使用instr函式判斷第乙個'_'字元的位置,進而確定每個source_code擷取幾個字串。

那為什麼減1呢?

是因為instr (source_code, '_', 1, 1)獲取的是源字串中'_'字元第一次出現的位置,再減1就得出了city字元個數。

獲取公司:

select

substr (

source_code,

instr (source_code, '_', 1, 1) + 1,

instr (source_code, '_', 1, 2) - instr (source_code, '_', 1, 1)-1

) as company

from

table_code_test

結果:

解釋:擷取源字串,從(第乙個'_'出現位置+1)開始,擷取個數為:第2個'_'出現位置減去第1個'_'出現位置,此時還多了乙個下劃線'_',再減去1即可得到代表公司字串。

獲取姓名:

select

substr (source_code, instr (source_code, '_', 1, 3) + 1) as stf_name

from

table_code_test

結果:

Oracle擷取字串

今天遇到的問題是 我需要乙個201802281530時間格式的字串 即年月日時分 但是讀取的oracle資料庫裡只有2018 02 28 15 30 00這種格式的char型別。由於程式大都是直接呼叫其他方法,不方便在程式內操作,只能在oracle讀取時解決問題。解決後的最終sql 為 substr...

oracle擷取字串

格式1 substr string string,int a,int b 格式2 substr string string,int a 解釋 格式1 1 string 需要擷取的字串 2 a 擷取字串的開始位置 注 當a等於0或1時,都是從第一位開始擷取 3 b 要擷取的字串的長度 格式21 str...

oracle 分割字串 擷取字串

在我們平時的處理過程總往往會遇到要把乙個字串拆分成乙個陣列,加在 in 後面作為條件,現提供兩種方似乎。1 正規表示式分割字串 select regexp substr 2,3,4,5 1,l count stype from dual,select level l count from dual ...