如何在SQL中的第n个定界符之后解析字符串

时间:2020-05-05 20:19:53

标签: sql sql-server regex charindex

我想在Array1 ( [0] => dfsg [1] => dfasg [2] => d5g [3] => ) Array2 ( [0] => d54fgv [1] => [2] => df4g4 [3] => d645 ) 下划线之后解析一个字符串。例如,在字符串中:

2020_Campaign_SG_测试电子邮件

我需要:

  • 在第一个下划线之后和第一个下划线之前提取文本nth 2,并创建名为Type的列
  • 在第二个下划线之后和
    之前提取文本Campaign。 3,并创建名为Segment的列
  • 在第三个下划线后提取文本SG,然后创建 名为名称的列

1 个答案:

答案 0 :(得分:1)

由于您使用的是SQL Server 16或更高版本,因此可以使用STRING_SPLIT(确保使用的兼容性级别至少为130)。

我无法在任何拨弄链接上使用以下代码,但是您可以将其复制/粘贴到https://sqliteonline.com/中(将其设置为MS SQL,连接,复制/粘贴并运行):

enter image description here

代码

这是我能想到的最简单的形式:

WITH x AS (
  SELECT
      value v,
      ROW_NUMBER() OVER (ORDER BY (SELECT 1)) n
    from STRING_SPLIT('2020_Campaign_SG_Test Email','_')  
)

SELECT
    [2] [Type],
    [3] Segment,
    [4] [Name]
  FROM x
  PIVOT(
    MAX(v) FOR n IN([2],[3],[4])
  ) y

输出

这将生成以下内容(第一行是表标题):

# Type        Segment    Name
  Campaign    SG         Test Email

说明

STRING_SPLIT部分

WITH x AS (
  SELECT
      value v,
      ROW_NUMBER() OVER (ORDER BY (SELECT 1)) n
    from STRING_SPLIT('2020_Campaign_SG_Test Email','_')  
)

在第一部分中,我创建了一个临时的命名结果集x(又名CTE or common table expression)。结果集使用STRING_SPLIT函数在下划线2020_Campaign_SG_Test Email字符上分割字符串_。我还使用ROW_NUMBER()对结果集的输出进行了编号。

这将生成以下内容(第一行是表标题):

# v              n
  2020           1
  Campaign       2
  SG             3
  Test Email     4

PIVOT部分

SELECT
    [2] [Type],
    [3] Segment,
    [4] [Name]
  FROM x
  PIVOT(
    MAX(v) FOR n IN([2],[3],[4])
  ) y

第二部分然后使用我们的结果集x,并使用PIVOT运算符将数据行相对于聚合转置为列。此处的聚合函数为MAX(v) FOR n IN([2],[3],[4])。使用MAX函数会删除所有NULL的值(否则它将旋转并将每个v移至其自己的列,并为其他列添加NULL值),只有我们第二,第三和第四项作为输出(因为您仅在原始问题中将这三项指定为输出)。