【问题标题】:Extracting Multiple Numerical Values from Text从文本中提取多个数值
【发布时间】:2019-07-25 23:37:41
【问题描述】:
048(70F-Y),045(DDI-Y),454(CMDE-Y)

我在一个列字段中有上述数据,我需要提取前面的每个数字,所以在上面的例子中我希望看到 048、045、454。

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

理想情况下,我希望结果显示在如下所示的新列中。我已经尝试了一些事情,但没有得到任何帮助。

我希望结果如下所示:

+----------+-----------------------------------+---------------+
| 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 |
+----------+-----------------------------------+---------------+

【问题讨论】:

  • 我会为这种情况推荐函数或循环
  • 我更喜欢使用循环,这就是我正在尝试开发但不知道如何设置它。
  • 在逗号上使用string_split()。然后使用left()charindex() 提取初始括号之前的所有内容。与listagg() 重新组合订单重要吗?
  • 我使用了 string_spilit 但不确定如何做你推荐的 left 和 charindex() 部分。
  • SELECT evt.EventId , s.value FROM [PBM_Ops_Reporting].[Pahub].[Events] AS EVT CROSS APPLY STRING_SPLIT(evt.[PAEditTypes], '(') S

标签: sql sql-server tsql ssms-2017


【解决方案1】:

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

  1. 使用string_splitcross apply 隔离每个项目
  2. 使用left 仅获取每个项目的第一部分以及CHARINDEX 以了解您必须在哪里停下来
  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

输出:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多