2014-07-03 26 views
1

我有一個字符串:使用SQL與多個背提取字符斜線

\_AAA\DDDD\09090\longtest 

我怎麼能只提取字符串09090
會有很多像這樣的字符串,我想提取第三個和第四個反斜槓之間的字符串。

+0

3個問題的工作示例:是每組\相同長度或可變長度的之間的文本?是第四個\總是最後一個?最後是什麼RDBMS?所有的SQL都不一樣。 – xQbert

+0

你的RDBMS是什麼?你想要純粹的SQL解決方案,還是說,你可以說,C#? –

回答

0

我會咬人。下面是抓住什麼是在第三場的Oracle解決方案:

select regexp_substr('\_AAA\DDDD\09090\longtest', '[^\]+', 1, 3) from dual; 

技術上講,它抓住了一個字符集不匹配反斜線的第三節比賽。

我剛剛意識到它不允許空字段。

這工作:

select nvl(regexp_substr(str, '([^\\]*)\\{0,1}', 1, level, 'i', 1), 'null') part 
from (select '\_AAA\DDDD\09090\longtest' str from dual) 
where level = 4 
connect by level <= regexp_count(str, '\') + 1; 

從這裏:

Regex - Don't match nulls after words

0

SQL Server的一個簡單的(雖然不一定有效)的解決方案是:

SELECT Substring(text, first, second - first) 
FROM (SELECT text, 
       Charindex('\', text, Charindex('\', text, Charindex('\', text)+1) 
       +1) 
       + 1      first, 
       Charindex('\', text, Charindex('\', text, Charindex('\', text, 
            Charindex 
            ('\', 
            text)+1)+1) 
            + 1) second 
     FROM table1)T 

見工作例如SQL Fiddle


編輯

更好的答案應該使用遞歸查詢。

嘗試這樣:

WITH A 
    AS (SELECT CAST(0 AS BIGINT)  AS idx1, 
       CHARINDEX('\', TEXT) idx2, 
       TEXT, 
       0      AS rn 
     FROM TABLE1 
     UNION ALL 
     SELECT CAST(IDX2 + 1 AS BIGINT), 
       CHARINDEX('\', TEXT, IDX2 + 1), 
       TEXT, 
       RN + 1 
     FROM A 
     WHERE IDX2 > 0) 
SELECT SUBSTRING(TEXT, IDX1, IDX2 - IDX1) 
FROM A 
WHERE RN = 3 

這是好多了,因爲你可以很容易地適應它來提取字符串的任何部分,不只是第三。

參見本上SQL Fiddle

相關問題