将值逐一传给查询条件,合并多行

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;

SQL Fiddle