使用SQL提取带有多个反斜杠的字符

使用SQL提取带有多个反斜杠的字符,sql,string,Sql,String,我有一个字符串: \_AAA\DDDD\09090\longtest 如何提取字符串09090? 将会有很多这样的字符串,我想提取第三个和第四个反斜杠之间的字符串。我会咬。下面是一个Oracle解决方案,它抓住了第三个领域的内容: select regexp_substr('\_AAA\DDDD\09090\longtest', '[^\]+', 1, 3) from dual; 从技术上讲,它获取与反斜杠不匹配的字符集的第三个匹配项 我刚刚意识到它不允许空字段 这项工作: select

我有一个字符串:

 \_AAA\DDDD\09090\longtest
如何提取字符串09090?
将会有很多这样的字符串,我想提取第三个和第四个反斜杠之间的字符串。

我会咬。下面是一个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;
从这里开始:


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 
请参见有关的工作示例

编辑

更好的答案是使用递归查询

试着这样做:

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 
它更好,因为您可以轻松地调整它以提取字符串的任何部分,而不仅仅是第三部分


参见3个问题上的工作示例:每组\之间的文本是相同长度还是可变长度?第四个总是最后一个吗?最后,什么是RDBMS?所有的SQL都不一样。你的RDBMS是什么?您想要纯SQL的解决方案,还是可以,比如说,C?