SQL:在数据字符串中查找动态长度字符

时间:2014-09-18 19:43:17

标签: sql search substring case substr

我不知道该怎么做,但我有一串数据。我需要从字符串中隔离出一个长度不同的数字。原始字符串的长度也不同。让我给你举个例子。这是一组原始数据字符串:

:000000000:370765:P:000001359:::3SA70000SUPPL:3SA70000SUPPL: 
:000000000:715186816:P:000001996:::H1009671:H1009671:  

对于这两个示例,我需要第一个3SA70000SUPPL和第二个H1009671。我该如何使用SQL?我听说案件陈述可能有效,但我不知道如何。请帮忙。

2 个答案:

答案 0 :(得分:1)

这适用于Oracle 11g:

with tbl as (
select ':000000000:370765:P:000001359:::3SA70000SUPPL:3SA70000SUPPL:' str from dual
union 
select ':000000000:715186816:P:000001996:::H1009671:H1009671:' str from dual
)
select REGEXP_SUBSTR(str, '([^:]*)(:|$)', 1, 8, NULL, 1) data
from tbl;  

enter image description here

其中可以描述为“查看第0个出现的零个或多个非冒号字符,后跟冒号或行尾,并返回第一个子组(数据少于冒号或结尾)这条线。)

从这篇文章:REGEX to select nth value from a list, allowing for nulls

抱歉,刚看到您正在使用DB2。我不知道是否有一个等效的正则表达式函数,但它可能仍然有用。

为了它的乐趣:SQL Fiddle

答案 1 :(得分:0)

第一个子字符串获取:::的字符串,第二个子字符串检索从:::开始的字符串:     声明@x varchar(1024)=':000000000:715186816:P:000001996 ::: H1009671:H1009671:'

declare @temp varchar(1024)= SUBSTRING(@x,patindex('%:::%', @x)+3, len(@x)) 
SELECT SUBSTRING( @temp, 0,CHARINDEX(':', @temp, 0))