从文本中提取多个数值

时间:2019-07-25 23:37:41

标签: sql sql-server tsql ssms-2017

048(70F-Y),045(DDI-Y),454(CMDE-Y)

我在列字段中有上述数据,我需要提取之前的每个数字,因此在上面的示例中,我想查看048、045、454。

请注意,您在上面的每条记录中,字段中的数据都会更改,您有3组数字。有时您可能只有一套或六套。我只需要捕获(左侧的所有数字集。

理想情况下,我希望结果显示在下面的新列中。我尝试了几件事,但是没有任何帮助将不胜感激。

我希望结果如下所示:

+----------+-----------------------------------+---------------+
| EventId  |            PAEditTypes            |     Edits     |
+----------+-----------------------------------+---------------+
|  6929107 | 082(SPA-Y),177(QL-Y)              |      082, 177 |
| 26534980 | 048(70F-Y),045(DDI-Y),454(CMDE-Y) | 045, 048, 454 |
+----------+-----------------------------------+---------------+

1 个答案:

答案 0 :(得分:0)

您可以通过以下步骤获得所需的输出:

  1. string_splitcross apply一起使用以隔离每个项目
  2. 使用leftCHARINDEX一起获取每个项目的第一部分
  3. 使用STRING_AGG生成最终结果,添加WITHIN GROUP子句以强制执行排序(如果排序不重要,则删除WITHIN GROUP子句)

这是应该起作用的TSQL示例:

declare @tmp table ( EventId  varchar(50), PAEditTypes varchar(200) )

insert into @tmp values
     ('6929107' ,'082(SPA-Y),177(QL-Y)'             ) 
    ,('26534980','048(70F-Y),045(DDI-Y),454(CMDE-Y)') 

select 
     EventId
   , PAEditTypes
   , STRING_AGG(left(value,CHARINDEX('(',value)-1),', ') WITHIN GROUP (ORDER BY value ASC) as Edits
from 
    @tmp
        cross apply 
    string_split(PAEditTypes, ',')
group by 
      EventId
    , PAEditTypes
order by
    EventId desc

输出:

enter image description here