2016-03-03 32 views
0

我在Oracle sql中運行以下代碼。我能夠獲得我想要的結果,但想了解如何應用替代方案。我想拉出總是從第18個字符開始的名字,但後面的名字和字符總是不同的。使用regexp_substr提取字符串的一部分

示例: 「在組5678分配給用戶John Smith」 的

這在表history.description找到。

如果我使用SUBSTR(HISTORY.DESCRIPTION,18,INSTR(HISTORY.DESCRIPTION,」中) - 18如姓名

我得到

我想 「約翰·史密斯」 我想要的結果SUBSTR(HISTORY.DESCRIPTION,18,REGEXP_SUBSTR(HISTORY.DESCRIPTION, '(\ S *)(\ W)', '中')

奧拉01722無效數字錯誤是我得到的。

我不理解如何應用此功能

+1

請仔細閱讀文檔,https://docs.oracle.com/cd/B12037_01/server.101/b10759/functions116.htm它說,第三個參數命名爲** **位置必須是正數或負數**,而您正在傳遞一個字符串「in」。 – krokodilko

回答

0

您能否認爲在第一個「user」和最後一個「in」之間抓取所有文本是安全的?這段文字會不會持續?

SQL> with history(description) as (
     select 'Assigned to user John Smith in group 5678' from dual 
    ) 
    select regexp_substr(description, 'user\s(.*)\sin', 1, 1, 'i', 1) name 
    from history; 

NAME 
---------- 
John Smith 

SQL> 

或者真正收緊正則表達式匹配更多的字符串,你可以改變它開始在18字符並匹配所有字符,但不包括在「組開始的空間「文本:

'^.{17}(.+) in group \d+$'