【问题标题】:SQL: Finding dynamic length characters in a data stringSQL:在数据字符串中查找动态长度字符
【发布时间】:2014-11-13 06:59:01
【问题描述】:

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

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

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

【问题讨论】:

  • 你能用英文解释一下你需要字符串的哪一部分吗?如果不知道用于隔离这两个值的算法,很难对两个示例提出任何建议。
  • 您使用的是什么数据库?你怎么知道你想要什么,只是最后一个分隔元素?
  • 这是一个 DB2 数据库。这些实际上没有分隔。它们似乎由冒号分隔,但事实并非如此。原始字符串实际上是单个表字段。如果我能抓住最后一个冒号“分隔”的条目,那就行了。这里的另一个问题是表格字段的长度为 150 个字符。基本上,我需要从字符串开头开始的第 7 个或第 8 个“定界”条目,这应该是静态的,所以如果我能以某种方式数到第 7 个或第 8 个冒号并将其子串出来,那就可以了。

标签: sql search substring case substr


【解决方案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;  

这可以描述为“查看第8次出现的零个或多个非冒号字符后跟冒号或行尾,并返回第1个子组(即数据减去冒号或结束行)。

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

抱歉,刚刚看到您使用的是 DB2。不知道有没有等价的正则表达式函数,不过说不定还是有帮助的。

为了好玩:SQL Fiddle

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-21
      • 1970-01-01
      • 2018-01-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多