英文:
Possible to Use Json Data in a Join Clause?
问题
我有一些跟踪数据,由于一些数据在“事件”之间发生变化,所以我将其存储为SQL Server中列的JSON。
我有这个
{"items":[{"ids":[51130]}]}
现在这里有项目ID。我现在想获取“项目”的信息,但我不确定如何做到这一点,因为我需要一些连接。
如果我使用常规连接来做这个,我会有类似这样的东西
SELECT *
FROM Brands
INNER JOIN Items ON Brands.Id = Items.BrandId
INNER JOIN 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]}]}
英文:
I have some tracking data and since some of the data changes between "events" I am storing it as a JSON in a column in SQL Server.
I have this
{"items":[{"ids":[51130]}
Now this has the item id. I now want to get the information of the "item" but I am not sure how to do this as I would need some joins.
If I was doing this with regular joins I would have something like this
SELECT *
FROM Brands INNER JOIN
Items ON Brands.Id = Items.BrandId
Events ON Events.ItemId = Items.Id
where Items.Id in (51130)
Sample Data
Brands
1 Apple
2 Samsung
Items
id name description brandId
51130 Galaxy 10 "Smartphone" 2
Event
id Details
1 {"items":[{"ids":[51130]}]
答案1
得分: 2
我希望我理解正确。您需要解析存储在 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
英文:
I hope I understand this correctly. You need to parse the JSON, stored in details
column and return the content as a table using OPENJSON()
. The next example demonstrates how to use OPENJSON()
with one table (note, that the JSON in the question is not correct):
Table:
CREATE TABLE Events (
id int,
details nvarchar(max)
)
INSERT INTO Events (id, details)
VALUES (1, N'{"items":[{"ids":[51130]}]')
Statement:
SELECT id, itemId
FROM Events
CROSS APPLY OPENJSON(details, '$.items[0].ids') WITH (itemId int '$')
Result:
----------
id itemId
----------
1 51130
For complex statements, you may try to use the appropriate joins to get the expected results.
Tables:
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]}]')
Statement:
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
Result:
----------------------------------------------------------------------
brandId brandName id name description brandId id itemId
----------------------------------------------------------------------
2 Samsung 51130 Galaxy 10 Smartphone 2 1 51130
答案2
得分: 0
为了开始,我假设您使用SQL的本身逻辑来插入JSON。
要检索您想要的数据,必须使用以下函数:
JSON_VALUE("yourjsoncolumn", '$.yourjson.atribute') = 51130
在这篇文章中有详细的解决方案说明。
英文:
For begin, i suppose you use sql's own logic to insert json.
To retrieve the data you want, must use this function
JSON_VALUE("yourjsoncolumn", '$.yourjson.atribute') = 51130
In this article have full explanation to resolve your problem.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论