2017-05-12 50 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谢谢,我下次再看看这个。 –