当前位置: 首页 > 面试题库 >

将可变长度定界的字符串拆分为多行(SQL)

赫连琦
2023-03-14
问题内容

我有一张表,其中包含一列以可变长度定界的字符串,例如:

20,0,5 ,, ^ 24,0,0 ,, ^ 26,0,0 ,, ^
281,0,0 ,, ^ 34,0,2 ,, ^ 48,0,2 ,, ^ 44, 0,2
,, ^ 20,0,10 ,, ^ 20,5,5 ,, ^ 379,1,1 ,, ^ 26,1,2 ,, ^ 32,0,1 ,, ^ 71,0,
2,^

我需要做的是拆分此字符串,以便^字符后的每个数字都返回到新行。喜欢:

Item Number Item Code
Item1 20
Item2 ^24
Item3 ^24
Item4 ^27
Item5 ^28
Item6 ^65
Item7 ^66
Item8 ^39
Item9 ^379
Item10 ^448
Item11 ^427

我已经尝试了各种分割函数,并且可以通过在多个列中对值进行子字符串化,然后使用unpivot在多个行中返回它们来设法获得所需的结果,但是此方法不能处理此字符串的可变长度。

有更好的方法的想法吗?


问题答案:

首先,让我说,这就是您首先不应该在字段中使用逗号分隔数据的原因。没有简单或有效的方法来使用它。

也就是说,您可以使用递归查询来拆分字符串并从中获取数字:

with split as
(
  select
    item = cast('' as varchar(max)),
    source = cast('20,0, 5,,^24,0, 0,,^26,0, 0,,^281,0, 0,,^34,0, 2,,^48,0, 2,,^44,0, 2,,^20,0, 10,,^20,5, 5,,^379,1, 1,,^26,1, 2,,^32,0, 1,,^71,0, 2,,^' as varchar(max))
  union all
  select
    item = substring(source, 1, charindex(',,', source)),
    source = substring(source, charindex(',,', source) + 2, 10000)
  from split
  where source > ''
)
select substring(item, 1, charindex(',', item) -1)
from split
where item > ''

结果:

20
^24
^26
^281
^34
^48
^44
^20
^20
^379
^26
^32
^71


 类似资料:
  • 问题内容: 有没有办法在不知道字符串长度的情况下,将一个字符长的字符串切成4个字符串,每个字符长? 例如: 问题答案:

  • 我有一个很长的问题。我想用Python把它分成几行。在JavaScript中实现这一点的一种方法是使用几个句子,并用操作符将它们连接起来(我知道,这可能不是最有效的方法,但我并不真正关心这一阶段的性能,只关心代码的可读性)。例子: 我试着用Python做类似的事情,但没有成功,所以我用来拆分长字符串。然而,我不确定这是否是唯一/最好/最好的方法。看起来很尴尬。实际代码:

  • 问题内容: 我如何将字符串分成多行,如下所示? 问题答案: Swift 4包括对多行字符串文字的支持。除换行符外,它们还可以包含未转义的引号。 较早版本的Swift不允许您在多行上使用单个文字,但可以在多行上将文字添加在一起:

  • 问题内容: 这是该问题的后续措施。 问题在下面的第二行。 问题答案: 具体根据 源,其使用,

  • 我想打破一个字符串Java使用数字作为分隔符,但保留数字。一些研究表明,从String中使用分裂方法()是合适的,但是我不明白如何做到这一点。为了进一步解释我的问题,我将使用一个例子: 通过像下面的示例一样调用方法split,而不使用lookahead和lookahead,我得到了预期的输出 但如果我尝试使用“前瞻”来实现这一点: 通过使用lookback,我得到了一个异常: 线程“main”ja

  • 问题内容: 如何在Java 中将字符串拆分为相等大小的子字符串。例如。大小相等的4个应该给出输出。 问题答案: 这是regex一线版: 是一个零宽度断言,它与上一个匹配结束的位置匹配。如果是以前没有的比赛,它的输入的开始,同相匹配。后面的封闭式匹配从最后一场比赛的末尾开始算起的四个字符的位置。 都是落后的,都是高级正则表达式功能,并非所有版本都支持。此外,在支持它的所有口味上实现的方式不一致。此技