【问题标题】:Possible to Use Json Data in a Join Clause?可以在连接子句中使用 Json 数据吗?
【发布时间】:2020-01-03 17:50:17
【问题描述】:

我有一些跟踪数据,由于“事件”之间的一些数据发生变化,我将其作为 JSON 存储在 SQL Server 的列中。

我有这个

{"items":[{"ids":[51130]}

现在这有项目 ID。我现在想获取“项目”的信息,但我不确定如何执行此操作,因为我需要一些连接。

如果我用常规连接来做这个,我会得到这样的东西

SELECT        *
FROM            Brands INNER JOIN
                         Items ON Brands.Id = Items.BrandId
                         Events ON Events.ItemId = Items.Id
                 where Items.Id in (51130)

样本数据

Brands
1   Apple
2   Samsung

Items
id  name description brandId
51130 Galaxy 10  "Smartphone"  2

Event
id Details 
1  {"items":[{"ids":[51130]}]

【问题讨论】:

  • 允许任何布尔表达式。您需要提取要比较的字段。
  • json 位于事件表中(在名为 details 的列中)。 Brands 和 Items 是“item”信息所在的地方,因此“id”是 Items 的主键。
  • 我添加了一些示例数据。

标签: sql json sql-server sql-server-2017


【解决方案1】:

我希望我理解正确。您需要解析存储在details 列中的JSON,并使用OPENJSON() 将内容作为表格返回。下一个示例演示如何将OPENJSON() 与一个表一起使用(注意,问题中的 JSON 不正确):

表:

CREATE TABLE Events (
   id int, 
   details nvarchar(max)
)
INSERT INTO Events (id, details)
VALUES (1, N'{"items":[{"ids":[51130]}]')

声明:

SELECT id, itemId
FROM Events
CROSS APPLY OPENJSON(details, '$.items[0].ids') WITH (itemId int '$') 

结果:

----------
id  itemId
----------
1   51130

对于复杂的语句,您可以尝试使用适当的连接来获得预期的结果。

表格:

CREATE TABLE Brands (
   brandId int,
   brandName nvarchar(100)
)
INSERT INTO Brands
   (BrandId, BrandName)
VALUES
   (1, N'Apple'),
   (2, N'Samsung')
CREATE TABLE Items (
   id int,
   name nvarchar(50),
   description nvarchar(50),
   brandId int
)   
INSERT INTO Items
   (id, name, description, brandId)
VALUES
   (51130, N'Galaxy 10', N'Smartphone', 2)
CREATE TABLE Events (
   id int, 
   details nvarchar(max)
)
INSERT INTO Events 
   (id, details)
VALUES
   (1, N'{"items":[{"ids":[51130]}]')

声明:

SELECT *
FROM Brands b
INNER JOIN Items i ON b.brandId = i.BrandId
INNER JOIN (
   SELECT id, itemId
   FROM Events
   CROSS APPLY OPENJSON(details, '$.items[0].ids') WITH (itemId int '$') 
) e ON i.id = e.itemId

结果:

----------------------------------------------------------------------
brandId brandName   id      name        description brandId id  itemId
----------------------------------------------------------------------
2       Samsung     51130   Galaxy 10   Smartphone  2       1   51130

【讨论】:

    【解决方案2】:

    首先,我假设你使用 sql 自己的逻辑来插入 json。

    要检索你想要的数据,必须使用这个函数

    JSON_VALUE("yourjsoncolumn", '$.yourjson.atribute') = 51130
    

    在这篇文章中有完整的解释来解决你的问题。

    https://docs.microsoft.com/en-us/sql/relational-databases/json/json-data-sql-server?view=sql-server-ver15

    【讨论】:

    • 是的,插入是我自己的逻辑,但我现在需要获取“项目”的详细信息,因此它认为我需要一个连接子句。我也可能有“1”个 id 或 100 个 id 要查找,所以如果可能的话,我想尝试一次性完成所有这些,因此为什么我的 where 子句有一个“in 子句”
    • 让我看看我是否明白了...你有没有包含 Event 表的 details 列中的项目的 Items 表,在这种情况下是 json 的项目但什么都没有与 Event 和 Items 表 ID 有什么关系?
    猜你喜欢
    • 2012-10-07
    • 2013-03-03
    • 2017-01-14
    • 2019-11-08
    • 2019-02-20
    • 1970-01-01
    • 2017-05-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多