【问题标题】:TSQL Join JSON object array propertyTSQL Join JSON 对象数组属性
【发布时间】:2020-09-23 04:04:10
【问题描述】:

我有一个存储过程,它接受我使用来自 OPENJSON() 的数据插入的 JSON 字符串。

我的 json 字符串包含一个对象,其中包含一个字符串数组。

目前,我正在将 prop2 的原始 json 写入我的表格,但我正在寻找使用逗号分隔符连接 prop2 中的字符串并将其写入表格的方法。所以保存到 prop2 列的值是 'val1,val2'。

实现这一目标的最佳方法是什么?

我目前正在使用的一些样板:

DECLARE @json NVARCHAR(MAX) = N'
{
  "value" : [
  {
    "prop1" : "val",
    "prop2" : ["val1","val2"]
  }
 ]
}'

INSERT INTO dbo.mytable (prop1, prop2)
    SELECT prop1, prop2
      FROM OPENJSON (@json, '$.value')
      WITH (

    [prop1] [nvarchar](256) '$.prop1',
    [prop2] [nvarchar](256) '$.prop2' AS JSON
    )


谢谢!

【问题讨论】:

  • "所以保存到 prop2 列的值将是 'val1,val2'。" 不要。以规范化格式存储您的数据。 'val1,val2'没有标准化。
  • 我明白但不在乎。它需要被连接起来。
  • “我明白但不在乎”你应该在乎。存储分隔数据只会让事情变得更难,而不是更容易。实际上,最好将 JSON 或 XML 数据存储在分隔数据上。
  • @Larnu 我需要分隔数据。我理解你的推理,但在这种情况下,我不关心最佳实践。

标签: sql json sql-server tsql


【解决方案1】:

正如 cmets 中所述,以非标准化格式存储数据并不是一个好主意。但是,如果您需要解决方案,可以选择以下语句。只需使用 OPENJSON() 和默认架构解析 $.prop JSON 数组,然后使用 STRING_AGG() 聚合项目:

JSON:

DECLARE @json NVARCHAR(MAX) = N'
{
  "value" : [
  {
    "prop1" : "val",
    "prop2" : ["val1","val2"]
  }
 ]
}'

声明:

--INSERT INTO dbo.mytable (prop1, prop2)
SELECT j1.prop1, j2.prop2
FROM OPENJSON (@json, '$.value') WITH (
   [prop1] [nvarchar](256) '$.prop1',
   [prop2] [nvarchar](max) '$.prop2' AS JSON
) j1
OUTER APPLY (
   SELECT STRING_AGG([value], ',') WITHIN GROUP (ORDER BY CONVERT(int, [key]))
   FROM OPENJSON(j1.prop2)
) j2 (prop2)

结果:

prop1   prop2
val     val1,val2

【讨论】:

  • 谢谢。这正是我所需要的!
猜你喜欢
  • 2020-08-18
  • 2021-09-27
  • 2016-04-07
  • 1970-01-01
  • 2021-03-12
  • 1970-01-01
  • 1970-01-01
  • 2019-11-29
  • 2020-02-10
相关资源
最近更新 更多