2015-06-03 81 views
4

我需要選擇字符串中的第一個X字,其中x可以是0-100之間的任意數字。是否有捷徑可尋?我發現下面的例子來選擇從字符串中的第2個字:從Oracle的字符串中檢索第一個X字選擇

select regexp_replace('Hello world this is a test', '(\w+ \w+).*$','\1') as first_two 
from dual 

我怎麼會選擇一個字符串,其中X可以是從0到100的數第一X字?

+0

你需要什麼樣的結果?作爲單個字符串?或每個單詞一列?或每個單詞一行? –

+0

作爲單個字符串。下面的Rene的解決方案工作,除了我有一些字符串之間有兩個空格,它是失敗的。這並不是他的錯,因爲我沒有提到這一點。 –

+0

@羅伯特史密斯:我已經更新了我的答案,以便它可以在單詞之間有兩個(或更多)空格。 –

回答

3

選擇首先結束四個字:

select 
    regexp_replace(
    'Hello world this is a test etc', 
    '(((\w+)\s){4}).*', -- Change 4 to wanted number of words here! 
    '\1' 
    ) 
    from dual; 

編輯

上述解決方案只適用於單詞分隔恰好一個空格字符。如果字是由一個或多個空格分隔,該\s必須擴展到\s+

select 
    regexp_replace(
    'Hello world this is a test  etc', 
    '(((\w+)\s+){4}).*', -- Change 4 to wanted number of words here! 
    '\1' 
    ) 
    from dual; 
+0

謝謝先生工作完美!優雅的解決方 –

+0

如果有兩個空格,會發生什麼變化?我有一個字符串,比如'Hello world這是一個測試等',它有兩個空格並且失敗。謝謝。 –

+0

請定義「失敗」,舉例說明。 –

0

這將做到這一點,但它可能會有點不雅,改爲「2」字的號碼找到

select substr('this is a number of words',1,instr('this is a number of words',' ',1,2)) 
from dual 

不承擔詞總是與空間

1

這種方法需要提取你想要的單詞數的結果,則有效降低了多空間來一句:

select trim(regexp_replace(regexp_substr('Hello   world this is a test etc', '(([^ ]*)(|$)*){3}'), ' +', ' ')) 
from dual; 

編輯:這是越來越醜,但圍繞它包裹TRIM()擺脫尾隨空間(最後一個詞選定後的一個)。

+0

非常感謝。 –

+0

它正在工作,但唯一的一點細節是它在字符串的末尾留下了額外的空間。 –

+0

好的,我在它周圍添加了一個TRIM()調用來刪除尾部空間並更新我的帖子。附:雷內的解決方案也需要。 –

相關問題