【问题标题】:T-SQL - Parse multiple values into multiple rowsT-SQL - 将多个值解析为多行
【发布时间】:2021-11-04 15:40:32
【问题描述】:

我知道有很多关于将 JSON 对象解析为多行的问题 - 但我正在处理一个不包含实际 JSON 的列,而是一个已经从 JSON 数组中预提取的字符串。

我的桌子是这样的:

ID Group_ID
1234 ["abc"]
5678 ["def","hij"]
9999 ["klm","nop","qrs"]

每个 Group_ID 可以包含无限数量的值(每个值都用引号括起来)

如何将上表转换成这样的形式(每个 Group_ID 都有自己的行):

ID Group_ID
1234 abc
5678 def
5678 hij
9999 klm
9999 nop
9999 qrs

【问题讨论】:

  • 希望这里的目的是真正修复您现在遇到的损坏的架构,而不仅仅是尝试在更大的应用程序中处理数据。
  • @JoelCoehoorn - 很好奇你的意思是什么......你只是说最好的选择是在数据进入 SQL 服务器之前对其进行解析?这些数据来自 REST API,并且在某些 ETL 作业期间以这种格式插入到 SQL 中,但理论上我可以修改那些 ETL 作业,但我的想法是如果 SQL 可以处理它,为什么不采取阻力最小的路径......
  • 是的,你应该在插入之前解析它。如果这是给定的,我并不完全反对在某些情况下将 json 数据存储在数据库中,但是您应该围绕您可能需要查询的任何内容定义架构,并在插入时从 json 中提取这些字段。此外,将数组数据以任何格式存储在单个字段中几乎从不是个好主意。

标签: tsql sql-server-2016 cross-apply


【解决方案1】:

如果你是 sql server 2016+ 你仍然可以使用OPENJSON() 函数:

DECLARE @testdata TABLE
    (
        [ID] INT
      , [Group_ID] NVARCHAR(255)
    );

INSERT INTO @testdata (
                          [ID]
                        , [Group_ID]
                      )
VALUES ( 1234, '["abc"]' )
     , ( 5678, '["def","hij"]' )
     , ( 9999, '["klm","nop","qrs"]' );


SELECT      [ID]
          , [Value] AS [Group_ID]
FROM        @testdata
CROSS APPLY OPENJSON([Group_ID]);

给出结果:

ID          Group_ID
----------- ----------
1234        abc
5678        def
5678        hij
9999        klm
9999        nop
9999        qrs

【讨论】:

  • 这绝对比STRING_SPLIT()干净得多。
【解决方案2】:

您可以使用string_split 轻松获取您的行,如下所示:

select t.Id, s.value Group_Id
from t
cross apply String_Split(Replace(Replace(Replace(group_id,'"',''),'[',''),']',''),',')s

【讨论】:

    【解决方案3】:

    假设方括号和双引号永远不会潜入数据中,我们可以使用 PARSENAME() 作弊,它将提取这些分隔符之间的内容:

    SELECT w.ID, Group_ID = PARSENAME(f.value, 1)
      FROM dbo.what AS w 
      CROSS APPLY STRING_SPLIT(PARSENAME(w.group_id, 1), ',') AS f;
    

    db<>fiddle

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-08
      相关资源
      最近更新 更多