使用以下数据库架构,我尝试检索与属性和指示器(如果它们已连接)组合的项目的 JSON。
我开始于:
DECLARE @Item TABLE
(
ItemId INT,
Name VARCHAR(25)
);
INSERT INTO @Item
(
ItemId,
Name
)
VALUES
(
1,
'Item 1'
),
(
2,
'Item 2'
);
DECLARE @Property TABLE
(
PropertyId INT,
Name VARCHAR(10)
);
INSERT INTO @Property
(
PropertyId,
Name
)
VALUES
(
1,
'Property 1'
),
(
2,
'Property 2'
),
(
3,
'Property 3'
);
DECLARE @ItemProperty TABLE
(
ItemId INT,
PropertyId INT
);
INSERT INTO @ItemProperty
(
ItemId,
PropertyId
)
VALUES
(
1,
1
),
(
1,
2
),
(
2,
2
),
(
2,
3
);
SELECT *
FROM @Item AS i
OUTER APPLY (
SELECT
p.Name,
CASE WHEN ip.PropertyId IS NOT NULL THEN
CAST(1 AS BIT)
ELSE CAST(0 AS BIT)
END AS ItemExists
FROM @Property AS p
LEFT JOIN @ItemProperty AS ip ON ip.PropertyId = p.PropertyId
AND ip.ItemId = i.ItemId
) a
WHERE i.ItemId = 1
FOR JSON AUTO, WITHOUT_ARRAY_WRAPPER;
这给了我以下结果:
{
"ItemId": 1,
"Name": "Item 1",
"a": [
{
"Name": "Property 1",
"ItemExists": true
},
{
"Name": "Property 2",
"ItemExists": true
},
{
"Name": "Property 3",
"ItemExists": false
}
]
}
但是,我希望得到这个结果
{
"ItemId": 1,
"Name": "Item 1",
"Property 1": true,
"Property 2": true,
"Property 3": false
}
当我向 @Property 添加新属性时,我希望自动添加它。
我怎样才能做到这一点?
不幸的是,SQL Server 目前不支持
JSON_OBJECT_AGG
,这会使这种类型的查询变得更加容易。STRING_AGG
相反,您需要使用和手动构建 JSONSTRING_ESCAPE
数据库<>小提琴
一种方法(我希望是正确的),因为你有未知数量的“Property x”,就是使用动态枢轴。请参阅此处了解更多信息。https://www.mssqltips.com/sqlservertip/6245/sql-server-dynamic-pivot-query/
我将结果集存储到#tmp 表中
然后,基于动态枢轴:
输出将是:
这是硬编码版本
dbfiddle在这里
无枢轴...
dbfiddle在这里