如果 SQL 中的列相同,如何使用 OPENJSON?

How to use OPENJSON if column is same in SQL?

我的数据库 table 创建为:

declare @library table (dependencies varchar(max))

insert into @library values('{"jar":"azure.com","maven":"azure.com","maven":"azure.com","maven":"azurebook.com"}')

我正在尝试让 JSON 成为

{
 "libraries":[
    {
      "jar" : { "coordinates":"azure.com"}
    },
    {
      "maven" : {"coordinates":"azure.com" }
    },
    {
      "maven" : {"coordinates":"azurebook.com" }
    }
 ]
}

我的 SQL 代码看起来像

SELECT
  (
      select
        j.jar as [jar.coordinates],
        j.maven as [maven.coordinates]
      FROM OPENJSON(l.dependencies)
        WITH (
          jar varchar(100),
          maven varchar(100)
        ) j
      FOR JSON PATH
  ) as libraries
  
FROM @library l
FOR JSON PATH, WITHOUT_ARRAY_WRAPPER;

我的输出与期望的不一样json

 {
 "libraries":[
    {
      "jar" : { "coordinates":"azure.com"}
    },
    {
      "maven" : {"coordinates":"azure.com" }
    }
 ]
}

在我的输出中,我的其他 属性 或列 maven 不包括。 有人可以帮我吗?

谢谢

您不能使用带有架构的 OPENJSON 来执行此操作,因为 JSON 通常只需要唯一的 属性 名称。您可以在没有架构的情况下使用 OPENJSON,但您也不能使用 FOR JSON 来创建这样的 JSON 值。你还需要 STRING_AGG

SELECT
  JSON_QUERY((
      SELECT
        '[' + STRING_AGG(
          '{"' +
          STRING_ESCAPE(j.[key], 'json') +
          '":"' +
          STRING_ESCAPE(j.value, 'json') +
          '"}',
          ','
        ) + ']'
      FROM OPENJSON(l.dependencies) j
  )) as libraries
FROM @library l
FOR JSON PATH, WITHOUT_ARRAY_WRAPPER;

db<>fiddle