2014-09-18 122 views
-1

我不知道如何做到这一点,但我有一串数据。我需要从可能长度不同的字符串中分离出一个数字。原始字符串的长度也不相同。让我举一个例子。下面是一组原数据串的:SQL:查找数据字符串中的动态长度字符

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

对于这两个实施例中,我需要3SA70000SUPPL从第二所述第一和H1009671。我将如何使用SQL来做到这一点?我听说病例陈述可能有效,但我不知道如何。请帮忙。

+0

你能否用英文解释你需要哪部分字符串。在不知道用于隔离这两个值的算法的情况下,很难在两个示例上提出任何建议。 – Bulat 2014-09-18 19:47:37

+2

你使用了哪个数据库?你怎么知道你想要什么,只是最后一个分隔的元素? – 2014-09-18 19:47:53

+0

这是一个DB2数据库。这些实际上并没有分隔。他们似乎被冒号划定界限,但事实并非如此。原始字符串实际上是单个表字段。如果我可以抓住最后一个冒号“分隔”条目,那就行了。这里的另一个问题是表字段的长度为150个字符。 基本上,我需要从字符串开头的第7或第8个“分隔”条目,这应该是静态的,所以如果我能以某种方式计算到第7或第8个冒号并将其排除,那就行得通了。 – Drauul 2014-09-18 19:59:11

回答

0

第一个子字符串获取字符串:::第二个子字符串检索字符串从:::到:: declare @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)) 
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

这可谓是“看的第八发生零个或多个非冒号字符,后跟一个冒号或行尾,并返回第一个子组(数据少于冒号或行尾)。

从这个帖子:REGEX to select nth value from a list, allowing for nulls

对不起,刚才看到你正在使用DB2。我不知道是否有一个等效的正则表达式函数,但也许它仍然有帮助。

为了好玩:SQL Fiddle