2017-05-12 81 views
0

在列中,我有一個字符串格式爲MID: ABC-123212-2 - SID: 21354Oracle SQL:通過在查詢中通過分隔符分割來提取數據

預期結果:ABC-123212-221354

試過

SELECT REGEXP_SUBSTR('MID: ABC-123212-2 - SID: 21354', '\d[0-9-]*', 1, 1) FROM DUAL; 

SELECT REGEXP_SUBSTR('MID: ABC-123212-2 - SID: 21354', '\d[0-9-]*', 1, 2) FROM DUAL; 

但結果只得到數量。

我怎麼能包括字母也由:和中間-

+0

@partycoder我需要提取「:」後的值: – Ianthe

回答

1

這會給你想要的東西,它可以在字段和隔板間處理任何空格。

要看看這個表達式是如何工作的,看regex101 Demo

要查看此查詢方式,請參閱dbfiddle demo

select 
regexp_replace(col1,'MID:\s*(\S+).*SID:\s*(\S+).*','\1') as field1 
,regexp_replace(col1,'MID:\s*(\S+).*SID:\s*(\S+).*','\2') as field2 
from 
(select 'MID: ABC-123212-2 - SID: 21354' as col1 from dual); 

輸出

FIELD1   FIELD2 
ABC-123212-2 21354 

說明:

正則表達式MID:\s*(\S+).*SID:\s*(\S+).*使用2個捕獲組,使用大括號()。所以在MID:之後,我們將捕獲第一組,然後在SID:之後,我們將捕獲下一個。

現在regexp_replace可以從正則表達式返回任何捕獲組。因此\1\2用於2個結果集。

0

,分割數據不需要REGEXP_SUBSTR()這一點,你可以只使用基本的字符串函數:

SELECT 
    SUBSTR(col, 6, INSTR(col, '- SID:') - 7) AS term1, 
    SUBSTR(col, INSTR(col, 'SID:') + 5)  AS term2 
FROM yourTable 

在大多數的情況下,我期望一個解決方案涉及的基礎字符串函數來超越基於正則表達式的解決方案。這並不是說正則表達式沒有時間和地點,但是對於像抽象這樣簡單的事情,我可能不會使用它。與往常一樣,我無法獲得在Rextester或SQLFiddle中工作的Oracle演示,但按照以下鏈接進行MySQL演示。字符串函數INSTR()SUBSTR()在Oracle和MySQL中的行爲幾乎相同,因此該邏輯仍然有效。

Demo

+1

我們也可以使用[dbfiddle.uk](http://dbfiddle.uk/?rdbms=oracle_11.2),但它不如sqlfiddle,因爲'dual'和其他一些東西在這裏不起作用,所以在測試查詢之前,您必須創建一個表並向其中插入數據。但是,如果沒有其他方法可行,這是一個很好的選擇 – Utsav

+1

@Utsav謝謝,我下次再看看這個。 –