将值逐一传给查询条件,合并多行
Pass value one by one to the query condition and combine multiple rows
我想根据 #permission table 的权限 ID 和 #source_audit table 值列中匹配的权限 ID 获取所有 role_ids。
然后将给定 permission_id 的所有 role_id 组合在一行中。
非常感谢任何帮助
create table #permission (
[permission_id] char(6) not null
)
insert into #permission
values
('-336'),
('-12016'),
('-12014')
create table #source_audit
(
role_id int,
value nvarchar(max)
)
insert into #source_audit
values
( 2453, '{"PermissionId":-336, "ConstraintTypeId":7}'),
( 2003, '{"PermissionId":-336, "ConstraintTypeId":7}'),
( 2123, '{"PermissionId":-12016, "ConstraintTypeId":7}'),
( 2893, '{"PermissionId":-14567, "ConstraintTypeId":7}')
到目前为止已尝试查询但未成功
select srae.*, x.Permission_Id
from #source_audit as srae
inner join #permission as x
on srae.value like '%' + CONVERT(varchar(32), permission_id) + '%'
and srae.value like '%"ConstraintTypeId":7%'
结果Table
permission_id
role_id
-336
2453, 2003
-12016
2123
您的 #source_audit.value
数据是 JSON,因此我们可以在其上使用 OPENJSON
来提取值。
您似乎想要匹配 permission_id
的绝对值(忽略负号)。
SELECT
p.permission_id,
roles = STRING_AGG(s.role_id, ', ')
FROM permission p
JOIN source_audit s
CROSS APPLY OPENJSON(s.value)
WITH ( PermissionId int, ConstraintTypeId int ) j
ON ABS(j.PermissionId) = ABS(p.permission_id) AND j.ConstraintTypeId = 7
GROUP BY
p.permission_id;
在 SQL Server 2016 或更早版本上,您需要使用 FOR XML
方法
SELECT
p.permission_id,
roles = STUFF((
SELECT CONCAT(', ', s.role_id)
FROM source_audit s
CROSS APPLY OPENJSON(s.value)
WITH ( PermissionId int, ConstraintTypeId int ) j
WHERE ABS(j.PermissionId) = ABS(p.permission_id)
AND j.ConstraintTypeId = 7
FOR XML PATH(''), TYPE
).value('text()[1]','nvarchar(max)'), 1, LEN(', '), '')
FROM permission p;
我想根据 #permission table 的权限 ID 和 #source_audit table 值列中匹配的权限 ID 获取所有 role_ids。
然后将给定 permission_id 的所有 role_id 组合在一行中。
非常感谢任何帮助
create table #permission (
[permission_id] char(6) not null
)
insert into #permission
values
('-336'),
('-12016'),
('-12014')
create table #source_audit
(
role_id int,
value nvarchar(max)
)
insert into #source_audit
values
( 2453, '{"PermissionId":-336, "ConstraintTypeId":7}'),
( 2003, '{"PermissionId":-336, "ConstraintTypeId":7}'),
( 2123, '{"PermissionId":-12016, "ConstraintTypeId":7}'),
( 2893, '{"PermissionId":-14567, "ConstraintTypeId":7}')
到目前为止已尝试查询但未成功
select srae.*, x.Permission_Id
from #source_audit as srae
inner join #permission as x
on srae.value like '%' + CONVERT(varchar(32), permission_id) + '%'
and srae.value like '%"ConstraintTypeId":7%'
结果Table
permission_id | role_id |
---|---|
-336 | 2453, 2003 |
-12016 | 2123 |
您的 #source_audit.value
数据是 JSON,因此我们可以在其上使用 OPENJSON
来提取值。
您似乎想要匹配 permission_id
的绝对值(忽略负号)。
SELECT
p.permission_id,
roles = STRING_AGG(s.role_id, ', ')
FROM permission p
JOIN source_audit s
CROSS APPLY OPENJSON(s.value)
WITH ( PermissionId int, ConstraintTypeId int ) j
ON ABS(j.PermissionId) = ABS(p.permission_id) AND j.ConstraintTypeId = 7
GROUP BY
p.permission_id;
在 SQL Server 2016 或更早版本上,您需要使用 FOR XML
方法
SELECT
p.permission_id,
roles = STUFF((
SELECT CONCAT(', ', s.role_id)
FROM source_audit s
CROSS APPLY OPENJSON(s.value)
WITH ( PermissionId int, ConstraintTypeId int ) j
WHERE ABS(j.PermissionId) = ABS(p.permission_id)
AND j.ConstraintTypeId = 7
FOR XML PATH(''), TYPE
).value('text()[1]','nvarchar(max)'), 1, LEN(', '), '')
FROM permission p;