将SQL结果输出到JSON(基于特定列的行)[Microsoft SQL Server]
我有三个表,下面是三个表,我正在共享我的SQL查询以从SQL打印JSON SEC_用户、用户配置文件条目、SEC_文件夹 正如您在JSON中看到的,有一个名为extension_tenant的键,它的值有Team1、Team2、Team3等等 当我运行上面的查询时,我得到一个包含JSON的单行查询结果,下面是图像,上面的JSON是下面结果的美化版本 如何基于不同的扩展名为创建单独的JSON 我想知道是否有一种方法可以打破这个基于extension_tenant的JSON,并将其输出到基于extension_tenant的行下面的行中 假设扩展名为_tenant=Team1的所有内容都存储在单独的JSON结果中 示例:适用于所有团队1将SQL结果输出到JSON(基于特定列的行)[Microsoft SQL Server],sql,json,sql-server,Sql,Json,Sql Server,我有三个表,下面是三个表,我正在共享我的SQL查询以从SQL打印JSON SEC_用户、用户配置文件条目、SEC_文件夹 正如您在JSON中看到的,有一个名为extension_tenant的键,它的值有Team1、Team2、Team3等等 当我运行上面的查询时,我得到一个包含JSON的单行查询结果,下面是图像,上面的JSON是下面结果的美化版本 如何基于不同的扩展名为创建单独的JSON 我想知道是否有一种方法可以打破这个基于extension_tenant的JSON,并将其输出到基于exte
{
"users": [
{
"displayName": "Dennis Law",
"givenName": "Dennis",
"surname": "Law",
"extension_user_type": "user",
"identities": [
{
"signInType": "emailAddress",
"issuerAssignedId": "dennislaw@gmail.com"
}
],
"extension_timezone": "VET",
"extension_locale": "en-IN",
"extension_tenant": "Team1"
},
{
"displayName": "Shaggy Nate",
"givenName": "Shaggy",
"surname": "Nate",
"extension_user_type": "user",
"identities": [
{
"signInType": "userName",
"issuerAssignedId": "Shaggynatealpha"
}
],
"extension_timezone": "NST",
"extension_locale": "en-AF",
"extension_tenant": "Team1"
}
]
} ";
对于所有作为团队2的扩展_租户
{
"users": [
{
"displayName": "Geroge West",
"givenName": "Geroge",
"surname": "West",
"extension_user_type": "user",
"identities": [
{
"signInType": "userName",
"issuerAssignedId": "gwest"
}
],
"extension_timezone": "PST",
"extension_locale": "en-GB",
"extension_tenant": "Team2"
}
]`
} ";
请告诉我是否有办法,如果您想要更多的数据,请发表意见。您只需要一个WITH..AS子句,在该子句中,除了最后两行之外,保留当前查询,然后按扩展名过滤掉,例如
您只需要一个WITH..AS子句,在该子句中保留除最后两行之外的当前查询,然后按扩展名过滤掉,例如
如果我正确理解了问题,您需要修改您的陈述,如下所示:
;WITH cte AS (
-- The current statement, without the FOR JSON part
SELECT ...
--FOR JSON PATH, ROOT('users')
)
SELECT DISTINCT t1.extension_tenant, t2.json
FROM cte t1
CROSS APPLY (
SELECT
displayName,
givenName,
surname,
extension_user_type,
JSON_QUERY(identities) AS identities,
extension_timezone,
extension_locale,
extension_tenant
FROM cte
WHERE extension_tenant = t1.extension_tenant
FOR JSON PATH, ROOT('users')
) t2 (json)
注意,您需要使用JSON_查询来防止转义标识JSON。以下简化示例是一个可行的解决方案:
;WITH cte AS (
SELECT displayName, extension_tenant, identities
FROM (VALUES
('Dennis Law', 'Team1', '[{"signInType": "userName", "issuerAssignedId": "Shaggynatealpha"}]'),
('Geroge West', 'Team2', '[{"signInType": "userName", "issuerAssignedId": "Shaggynatealpha"}]'),
('Shaggy Nate', 'Team1', '[{"signInType": "userName", "issuerAssignedId": "Shaggynatealpha"}]')
) ottr (displayName, extension_tenant, identities)
--FOR JSON PATH, ROOT('users')
)
SELECT DISTINCT t1.extension_tenant, t2.json
FROM cte t1
CROSS APPLY (
SELECT displayName, extension_tenant, JSON_QUERY(identities) AS identities
FROM cte
WHERE extension_tenant = t1.extension_tenant
FOR JSON PATH, ROOT('users')
) t2 (json)
结果:
extension_tenant json
Team1 {"users":[{"displayName":"Dennis Law","extension_tenant":"Team1","identities":[{"signInType": "userName", "issuerAssignedId": "Shaggynatealpha"}]},{"displayName":"Shaggy Nate","extension_tenant":"Team1","identities":[{"signInType": "userName", "issuerAssignedId": "Shaggynatealpha"}]}]}
Team2 {"users":[{"displayName":"Geroge West","extension_tenant":"Team2","identities":[{"signInType": "userName", "issuerAssignedId": "Shaggynatealpha"}]}]}
如果我正确理解了问题,您需要修改您的陈述,如下所示:
;WITH cte AS (
-- The current statement, without the FOR JSON part
SELECT ...
--FOR JSON PATH, ROOT('users')
)
SELECT DISTINCT t1.extension_tenant, t2.json
FROM cte t1
CROSS APPLY (
SELECT
displayName,
givenName,
surname,
extension_user_type,
JSON_QUERY(identities) AS identities,
extension_timezone,
extension_locale,
extension_tenant
FROM cte
WHERE extension_tenant = t1.extension_tenant
FOR JSON PATH, ROOT('users')
) t2 (json)
注意,您需要使用JSON_查询来防止转义标识JSON。以下简化示例是一个可行的解决方案:
;WITH cte AS (
SELECT displayName, extension_tenant, identities
FROM (VALUES
('Dennis Law', 'Team1', '[{"signInType": "userName", "issuerAssignedId": "Shaggynatealpha"}]'),
('Geroge West', 'Team2', '[{"signInType": "userName", "issuerAssignedId": "Shaggynatealpha"}]'),
('Shaggy Nate', 'Team1', '[{"signInType": "userName", "issuerAssignedId": "Shaggynatealpha"}]')
) ottr (displayName, extension_tenant, identities)
--FOR JSON PATH, ROOT('users')
)
SELECT DISTINCT t1.extension_tenant, t2.json
FROM cte t1
CROSS APPLY (
SELECT displayName, extension_tenant, JSON_QUERY(identities) AS identities
FROM cte
WHERE extension_tenant = t1.extension_tenant
FOR JSON PATH, ROOT('users')
) t2 (json)
结果:
extension_tenant json
Team1 {"users":[{"displayName":"Dennis Law","extension_tenant":"Team1","identities":[{"signInType": "userName", "issuerAssignedId": "Shaggynatealpha"}]},{"displayName":"Shaggy Nate","extension_tenant":"Team1","identities":[{"signInType": "userName", "issuerAssignedId": "Shaggynatealpha"}]}]}
Team2 {"users":[{"displayName":"Geroge West","extension_tenant":"Team2","identities":[{"signInType": "userName", "issuerAssignedId": "Shaggynatealpha"}]}]}
这正是我应该做的!谢谢你的回答!这正是我应该做的!谢谢你的回答!我认为在您的解决方案中,仅当您选择Team1或Team2时,它才会为您构建。也许在您可以嵌套的地方,比如从表中选择extension\u tenant=select*的地方……我认为在您的解决方案中,只有在您选择Team1或Team2时,它才会为您构建。可能是在您可以嵌套的地方,比如从表中选择扩展名。。。