2017-06-16 64 views
1

我想在Oracle中提取以下字符串。我怎樣才能做到這一點?如何在Oracle中提取字符串

  • 原始字符串:011113584378(+) CARD, STAFF
  • 期望的字符串:STAFF CARD
+3

什麼是從輸入到輸出的邏輯?格式將始終爲 SPACE <字母順序> COMMA SPACE <字母順序>?字母序列總是非空的?他們只是字母,還是可以包含DASH( - )或UNDERSCORE(_)或數字?在我們考慮任何類型的代碼之前,請先澄清一下邏輯。 – mathguy

回答

0

我想你必須寫一個PL/SQL函數的奢侈品?然後,只需使用"SUBSTR"和/或"INSTR"||concatenation operator來解析您的輸入。

下面是一個例子:

https://www.techonthenet.com/oracle/questions/parse.php

...該字段可能包含以下值:

F:\Siebfile\YD\S_SR_ATT_1-60SS_1-AM3L.SAF

在這種情況下,我需要返回的「價值1-60SS',因爲這是位於第3和第4下劃線之間的值。

SOLUTION:

create or replace function parse_value (pValue varchar2) 
    return varchar2 
is 
    v_pos3 number; 
    v_pos4 number; 

begin 

    /* Return 3rd occurrence of '_' */ 
    v_pos3 := INSTR (pValue, '_', 1, 3) + 1; 

    /* Return 4rd occurrence of '_' */ 
    v_pos4 := INSTR (pValue, '_', 1, 4); 

    return SUBSTR (pValue, v_pos3, v_pos4 - v_pos3); 

end parse_value; 
+4

爲什麼需要編寫一個PL/SQL函數來使用SUBSTR和INSTR? – mathguy

0

好吧,我會咬。這個例子使用REGEXP_REPLACE來描述字符串,保存你需要的部分,以便在返回之前重新排列它們。如果你展示了一些你正在處理的數據的真實世界的例子,那將會更好,因爲我只能保證這個例子可以與你提供的那一行一起工作。

正則表達式匹配從字符串開頭開始並以結束空間結束的任何字符。下一組任何字符直到但不包括逗號空間都是通過將它們包含在parens中來「記住」的。這被稱爲捕獲組。下一個捕獲的組是該逗號空間分隔符後面的字符集,直到該行的結尾(美元符號)。捕獲的組按照從左至右的順序引用。第三個參數是要返回的字符串,這是第二個和第一個捕獲的組,按順序由空格分隔。

SQL> with tbl(str) as (
    select '+011113584378(+) CARD, STAFF' from dual 
    ) 
    select regexp_replace(str, '^.*\) (.*), (.*)$', '\2 \1') formatted 
    from tbl; 

FORMATTED 
---------- 
STAFF CARD 

SQL>