【问题标题】:How to merge json arrray with table (SQL Server)如何将 json 数组与表合并(SQL Server)
【发布时间】:2021-06-20 07:46:50
【问题描述】:

我有两行 json,我想将 id 加入到单个选择中。

示例表 A

a
[{id: 1, name: "Alice"},{id:2, name: "Bob"}]
[{id: 5, name: "Charlie"},{id:6, name: "Dale"}

示例表 B

id age
1 30
2 32
3 20
4 14

期望的输出

c
[{id: 1, name: "Alice", age: 30},{id:2, name: "Bob", age: 32}]
[{id: 5, name: "Charlie", age: 20},{id:6, name: "Dale", age: 14}]

我想做类似的事情

select 
id,
name, 
age
from openJson(tableA) ta
with (
  id int '$.id',
  name nvarchar(50) '$.name'
)
inner join (
  select *
  from tableB tb
) on tb.id = ta.id
for json path

【问题讨论】:

  • 好的,那么您的问题是什么?你所拥有的东西有什么问题?
  • 你是不是没有引用 JSON 字段名?我认为 openjson 不适用于未引用的字段名称
  • 那么TableA中的每一行都是一个单独的数组?只是第二行的错字没有关闭该行的数组?
  • @squillman 是的。
  • @Larnu 我无法在多行上使用openJson。 (希望将每个单元格连接到另一个表格)。

标签: json sql-server join


【解决方案1】:

首先,这假设您的 JSON 实际上是有效的。您的任何元素(idname)都没有被引用,因此 JSON 实际上是无效的。另外我假设您的预期结果是错误的,因为查理给出的年龄是 20 岁,但该年龄属于具有 id 且值为 3 的人,而查理的 id5

无论如何,我们可以通过子查询来实现:

CREATE TABLE dbo.TableA (a nvarchar(MAX));
INSERT INTO dbo.TableA (a)
VALUES(N'[{"id": 1, "name": "Alice"},{"id":2, "name": "Bob"}]'),
      (N'[{"id": 5, "name": "Charlie"},{"id":6, "name": "Dale"}]');
GO
CREATE TABLE dbo.TableB (id int, age int);
INSERT INTO dbo.TableB (id, age)
VALUES (1,30),
       (2,32),
       (3,20),
       (4,14);
GO

SELECT (SELECT OJ.id,
               OJ.[name],
               B.age
        FROM OPENJSON(A.a)
             WITH (id int,
                   [name] nvarchar(50)) OJ
             LEFT JOIN dbo.TableB B ON OJ.id = B.id
        FOR JSON AUTO) a
FROM dbo.TableA A;
     
     
GO
DROP TABLE dbo.TableA;
DROP TABLE dbo.TableB;

db<>fiddle

【讨论】:

    猜你喜欢
    • 2012-05-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-24
    • 2014-09-30
    • 2021-11-24
    • 1970-01-01
    • 2019-03-23
    相关资源
    最近更新 更多