2013-07-15 156 views
3

我想從SQL查詢(oracle 11)中的文本框中返回第一行文本。文本框的內容如下所示:Oracle SQL:使用regexp_substr返回字符串的第一行

X WITHDRAWN 

    Explanation. 

我想返回第一行,即X WITHDRAWN。我不確定是否可以指定僅查看第一行,或者只是在回車之前返回所有文本 - 兩者都可以。

我想我需要使用regexp_substr,但我對語法不太確定。我曾嘗試過:

regexp_substr(TABLE.TEXT,'^.*$') 

但它沒有工作,所以任何援助將不勝感激!

編輯:使用的解決方案:

select regexp_substr(TABLE.TEXT, '[^,]+['||CHR(10)||']') from tab 

編輯:我注意到我正在我的回答返回換行和回車的混合物,所以我採用如下方案:僅返回文本並沒有額外的字符。

select 
    replace(replace(regexp_substr(TABLE.TEXT, '[^,]+['||CHR(10)||']'),CHR(10),''),CHR(13),'') 
    from tab 

編輯:繼@本的答案,我已經修改了我的解決方案如下:

select 
initcap(replace(regexp_substr(TABLE.TEXT, '.*$', 1, 1, 'm'),CHR(13),'')) 
from tab 

回答

5

Parado的正則表達式匹配所有不是逗號多次,後跟回車符。這意味着它不適用於換行符或文本中有逗號。

Oracle支持使用mmatch parameter的多行表達式。當使用此模式時,$匹配每行的結尾以及字符串的結尾。您可以大量使用這種簡單的表達:

regexp_substr(str, '.*$', 1, 1, 'm') 

也就是說匹配任何匹配字符串的第一次出現(第一行),接着是字符串的結尾,從第一個字符計數。

舉個例子:

with strings as ( 
select 'hi 
     hi again' as str 
    from dual 
    union all 
select 'bye 
     and again' 
    from dual 
     ) 
select regexp_substr(str, '.*$', 1, 1, 'm') 
    from strings 
+0

+1是的,你的解決方案比我的更好。 – Parado

+0

感謝您的答案本,雖然@ Parado的工作是爲了我的目的,但我認爲這是最好的答案,因爲我只需要刪除字符13,而不是字符10。 – bawpie

1

您可以嘗試使用直接的子(用回車 - CHR(10) - 作爲符號找到)而不是正則表達式:

SubStr(Table.Text, 1, decode(InStr(Table.Text, Chr(10)), 0, Length(Table.Text), InStr(Table.Text, Chr(10))) - 1) 
+0

謝謝,這似乎這樣的伎倆,但我已經接受了@ Parado的作爲,只是因爲它是一個有點簡單的答案! – bawpie

相關問題