SQL Server 2008先前的字符串提取

SQL Server 2008先前的字符串提取,sql,sql-server,sql-server-2008,tsql,Sql,Sql Server,Sql Server 2008,Tsql,我在SQL列中有如下字符串。我想将它们提取为GB总量。例如: Original Column ---------> Expected Output from a TSQL function ------------------------------------------- $15 / 1GB 24m + Intern 120MB ----------> 1.12 GB $19.95 / 500MB + $49.95 / 9GB Blackberry -----> 9.5GB

我在SQL列中有如下字符串。我想将它们提取为GB总量。例如:

Original Column ---------> Expected Output from a TSQL function
-------------------------------------------
$15 / 1GB 24m + Intern 120MB ----------> 1.12 GB
$19.95 / 500MB + $49.95 / 9GB Blackberry -----> 9.5GB
$174.95 Blackberry 24GB + $10 / 1GB Datapack ----> 25GB
$79 / 6GB --> 6GB
Null --> Null
$20 Plan --> 0GB
注:就我们的目的而言,1000MB=1GB(不是1024)

模式是数字后跟GB/MB,通常它们的组合方式类似于1GB(没有任何空间,但有时可能包含一个空间,如果很难实现此异常,这并不特别重要)

有时,在同一个字符串中出现多达三到四个GB/MB实例,这些实例通常用+号分隔(请参见上面示例的第2行和第3行)


我已经看到了如何在一个答案中提取美元值,其中数字后面跟美元,或者提取字符串中的所有整数,但我不想提取美元值或字符串中的所有整数。我只需要字符串中GB/MB的总和。

以下内容可能显得有些具体,而且过于假设,即使对于一个特定的、过于假设的解决方案来说,它可能看起来有点过于复杂。尽管如此,我希望它至少能成为一个良好的起点

以下是我必须做出的假设,以避免使脚本更加复杂:

  • 要提取的值从不包含小数点(为整数)

  • 要提取的值之前总是有空格或列值的开头

  • GB
    MB
    都不可能是流量大小(要提取的值)以外的任何内容的一部分

  • GB
    MB
    前面都没有空格

  • 所有字符串要么是唯一的,要么伴随着另一列或多列,可以用作键值。(特别是我的解决方案,它使用一个附加列作为键。)

  • 下面是我的尝试(它确实返回了原始帖子中提供的所有样本数据的预期结果):

    基本上,想法是首先将所有的千兆字节转换成兆字节,然后才能搜索和提取兆字节量。搜索和提取方法涉及递归CTE,主要包括以下步骤:

    1) 找到第一个
    MB
    的位置

    2) 查找紧靠
    MB
    之前的数字长度

    3) 在第一个
    MB
    结尾处切掉字符串的开头

    4) 从步骤1重复,直到找不到
    MB

    5) 将找到的数字连接到原始字符串列表以提取金额本身

    之后,我们只需按键值分组,并对获得的金额求和。以下是输出:

    id  str                                           gb
    --  --------------------------------------------  ------
    1   $15 / 1GB 24m + Intern 120MB                  1.12GB
    2   $19.95 / 500MB + $49.95 / 9GB Blackberry      9.5GB
    3   $174.95 Blackberry 24GB + $10 / 1GB Datapack  25GB
    4   $79 / 6GB                                     6GB
    5   NULL                                          NULL
    6   $20 Plan                                      0GB
    7   460MB                                         0.46GB
    

    你试过什么?因为您需要使用
    子字符串
    @OMGPonies设置东西,老实说,我不知道该怎么做,有点困惑。我尝试使用CTE递归,然后意识到如何在字符串中从后向前移动,因为GB或MB最终有点困惑。我不羡慕你——字符串处理会很脆弱。需要在逻辑中考虑任何可能性。CTE过于复杂。流量大小是否总是以空格开头?@AndriyM是的,99%的情况下,除非是数据输入错误,其中流量大小可能是唯一的因素。9GB/159.95美元的黑莓真是太慷慨了。非常感谢你!
    
    id  str                                           gb
    --  --------------------------------------------  ------
    1   $15 / 1GB 24m + Intern 120MB                  1.12GB
    2   $19.95 / 500MB + $49.95 / 9GB Blackberry      9.5GB
    3   $174.95 Blackberry 24GB + $10 / 1GB Datapack  25GB
    4   $79 / 6GB                                     6GB
    5   NULL                                          NULL
    6   $20 Plan                                      0GB
    7   460MB                                         0.46GB