2012-06-20 56 views
0

我在Oracle中有一個表,其中一列包含UserIds,其格式爲\。例如「fin \ george」,「sales \ andy」等。我如何使用REGEXP_SUBSTR函數從UserIds中獲取只。即我只想獲取「喬治」,「安迪」等。我已經實現了使用SUBSTR函數所需的reult,但我想在這種情況下使用REGEXP_SUBSTR。Oracle:在這種情況下如何使用regexp_substr

我試着這樣做:

SELECT REGEXP_SUBSTR('fin\george','\[^\]+,') "UserName" FROM DUAL; 

但它did'nt幫助。任何人都可以指出我的錯誤嗎?

回答

3

我相信你想使用一個regexp_replace與反向引用。我假設\之前和之後的所有字符都是字母。如果你允許使用數字,你可以使用[[:alnum:]]而不是[[:alpha::]

1* SELECT REGEXP_replace('fin\george', 
          '([[:alpha:]]+\\)([[:alpha:]]+)$', 
          '\2') "UserName" 
     FROM DUAL 
SQL>/

UserNa 
------ 
george 
0

你必須使用轉義:\\代替\

+0

這樣做會給這個輸出:「\ george」 – Luftwaffe

0
select regexp_replace('fin\george', '.*\\', null) from dual; 

回報george

正則表達式會匹配任何字符,然後跟着\(它被轉義),儘可能多次(貪婪)。 所以它會匹配所有東西直到最後的\。 然後將匹配字符串替換爲null

null是默認所以

select regexp_replace('fin\george', '.*\\') from dual; 

做同樣的事情

相同的表達可以從路徑名的末尾例如提取文件名

select regexp_replace ('fin\fin2\fin3\fin4\george', '.*\\') from dual; 

也將返回george

0
SQL> SELECT REGEXP_SUBSTR('fin\george', '[^\]+', 1, 2) AS userId from dual; 

USERID 
------ 
george 

this Oracle Base article

+0

Stack Overflow正在刪除\,因爲它是一個轉義字符。您可以突出顯示您的代碼並點擊'{}'將代碼標記爲代碼。 – Ben

0

最簡單的方法(恕我直言)要做到這一點是:

SELECT REGEXP_SUBSTR('fin\george', '[^\\]+$') AS "UserName" FROM DUAL; 

與原始查詢的問題包括(a)該\字符沒有逃脫(b)正則表達式中有一個額外的逗號。我在這裏使用了字符串末尾的錨點$,假設有不多於兩個由\分隔的元素。如果有兩個以上的,你只需要第二個,你可以使用以下命令:

SELECT REGEXP_SUBSTR('fin\george\ringo', '[^\\]+', 1, 2) AS "UserName" 
    FROM DUAL; 

這告訴Oracle開始尋找字符串的第一個字符,並返回的第二場比賽。