tsql - 如何在多行上使用 OPENJSON

标签 tsql open-json

我有一个包含多行的临时表,每一行都有一个名为 Categories 的列。 ;其中包含一个非常简单的 json 数组 ids对于不同表中的类别。

临时表的几个示例行:

Id                                      Name    Categories
---------------------------------------------------------------------------------------------
'539f7e28-143e-41bb-8814-a7b93b846007'  Test 1  ["category1Id", "category2Id", "category3Id"]
'f29e2ecf-6e37-4aa9-aa56-4a351d298bfc'  Test 2  ["category1Id", "category2Id"]
'34e41a0a-ad92-4cd7-bf5c-8df6bfd6ed5c'  Test 3  NULL

现在我想做的是从临时表中的所有行中选择所有类别 ID。

我所拥有的是以下内容,它不起作用,因为它给了我以下错误:

Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression.


SELECT
     c.Id
    ,c.[Name]
    ,c.Color
FROM
    dbo.Category as c
WHERE
    c.Id in (SELECT [value] FROM OPENJSON((SELECT Categories FROM #TempTable)))
and c.IsDeleted = 0

我想这是有道理的,因为我选择了多行并且需要解析每行各自的类别 ids json。我只是不知道该怎么做/改变才能给我想要的结果。预先感谢您的任何帮助。

最佳答案

您需要像这样使用 CROSS APPLY:

SELECT id ,
       name ,
       t.Value AS category_id
FROM   #temp
       CROSS APPLY OPENJSON(categories, '$') t;

然后,您可以加入您的 Categories表使用 category_id列,是这样的:
SELECT id ,
       name ,
       t.Value AS category_id,
       c.*
FROM   #temp
       CROSS APPLY OPENJSON(categories, '$') t
       LEFT JOIN Categories c ON c.Id = t.Value

关于tsql - 如何在多行上使用 OPENJSON,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58771778/

相关文章:

sql - 如何按层次结构对行进行排序

sql-server - SQL Server Openjson 将详细信息提取到表中

json - 如何将复杂的 JSON 字符串放入 SQL Server 列中

sql-server - SQL 服务器 : get weekly deposit changes using recursive CTE

sql-server - SQL Server 无效版本 : 15 (Microsoft. SqlServer.Smo)

SQL OPENJSON - 解析 JSON 数组

sql - JSON 对象查询 SQL Server

sql - Powershell从txt文件中的查询调用-sqlcmd

sql - 防止使用 SQL 触发器插入重叠的日期范围

sql - 如何在 T-SQL 中根据前几个月的数据确定缺失月份的值