从oracle中的字符串中获取值

时间:2018-05-25 10:14:28

标签: sql oracle oracle11g

我的表中有一个名为NARRATION的列,其值如下所示。

NARRATION
-------------------------------------
BI DS NO 6005527182
BI DS NO. 485019
CI DS NO.6008364862(2000*1) 
CI DS NO.1905180207 10*1) EDDF34592845
CI DS NO.2105180520-(50*1) DDFF39844240
CI DS NO.2105180653 (2000*1) DFSD39844240
CI DS NO.1905180220/(500*3,20
CI DS NO.2105180166*(200*1) DSFSF39844240 

我想在文字 DS NO。之后得到第一个单词,直到下一个空格或任何其他特殊字符,如下所示。 有些时候,在 DS NO。之后也可能存在空间,并且从空格词开始我需要推导出来。

NARRATION                                 |DERIVE_NARRATION  
------------------------------------------|----------------
BI DS NO 6005527182                       |6005527182
BI DS NO. 485019                          |485019
CI DS NO.6008364862(2000*1)               |6008364862
CI DS NO.1905180207 10*1) EDDF34592845    |1905180207
CI DS NO.2105180520-(50*1) DDFF39844240   |2105180520
CI DS NO.2105180653 (2000*1) DFSD39844240 |2105180653
CI DS NO. 1905180220/(500*3,20            |1905180220
CI DS NO.2105180166*(200*1) DSFSF39844240 |2105180166

请帮我查询。

1 个答案:

答案 0 :(得分:3)

您可以使用regexp_substr获取所需内容。 假设你的特殊字符"都在您的样本数据中列出,这应该做的工作

select narration,
       regexp_substr(narration, 'DS NO([ \.]*)([^- \\/\*(]*)', 1, 1, 'i', 2)
from tab

NARRATION                                 DERIVE_NARRATION
----------------------------------------- ----------------------------
BI DS NO 6005527182                       6005527182
BI DS NO. 485019                          485019
CI DS NO.6008364862(2000*1)               6008364862
CI DS NO.1905180207 10*1) EDDF34592845    1905180207
CI DS NO.2105180520-(50*1) DDFF39844240   2105180520
CI DS NO.2105180653 (2000*1) DFSD39844240 2105180653
CI DS NO. 1905180220/(500*3,20            1905180220
CI DS NO.2105180166*(200*1) DSFSF39844240 2105180166

工作原理:它查找字符串" DS NO"然后是空格或圆点,然后获取以下字符,继续前进,直到找到[^- \\/\*(]中列出的"特殊字符"。 参数2用于获取第二个匹配表达式。

使用该样本数据,您似乎需要获得一个数字,更多的是所有内容直到#34;特殊字符&#34 ;;如果是这样,您可以将其编辑为:

regexp_substr(narration, 'DS NO([ \.]*)([0-9]*)', 1, 1, 'i', 2)