如何在多行数据上使用OPENJSON

8

我有一个临时表,其中有多行数据,每一行都有一个名为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。 以下是我的代码,但它不起作用,因为给出了以下错误提示:
“子查询返回多个值。当子查询跟随=,!=,<,<=,>,>=时,或者当子查询用作表达式时,不允许这样做。”
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

我猜这是因为我选择了多行并需要解析每行各自的类别ID JSON,所以失败了。我不确定该怎么做/更改才能得到我想要的结果。提前感谢您的任何帮助。

1个回答

16
您需要使用CROSS APPLY,如下所示:
SELECT id ,
       name ,
       t.Value AS category_id
FROM   #temp
       CROSS APPLY OPENJSON(categories, '$') t;

然后,您可以使用 category_id 列联接到您的 Categories 表中,就像下面这样:

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

1
是的,那正是我需要做的。谢谢! - Quiver

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接