基于多字段条件表的HR员工访问权限匹配SQL实现求助
HR数据权限匹配SQL实现方案
核心逻辑
你场景里的条件表空字段代表通配规则,即对应维度不做权限限制,只有非空的维度才要求员工原始数据和权限规则完全匹配,最终将符合任意一条权限规则的员工数据去重后输出即可得到预期结果。
实现SQL
先约定表和字段命名,你可以根据实际业务命名调整:
- 权限条件表:
hr_permission_criteria,包含HR人员ID、region、division、business_unit、head_of_department等8个管控字段 - 员工原始数据表:
employee_data,包含所有员工属性字段,和条件表管控字段一一对应
SELECT DISTINCT ed.* FROM employee_data ed JOIN hr_permission_criteria hpc ON -- 维度匹配规则:条件表字段为空则跳过匹配,非空则要求值相等 (hpc.region IS NULL OR hpc.region = ed.region) AND (hpc.division IS NULL OR hpc.division = ed.division) AND (hpc.business_unit IS NULL OR hpc.business_unit = ed.business_unit) AND (hpc.head_of_department IS NULL OR hpc.head_of_department = ed.head_of_department) -- 剩余4个管控字段按相同逻辑补充即可 -- AND (hpc.管控字段5 IS NULL OR hpc.管控字段5 = ed.管控字段5) -- AND (hpc.管控字段6 IS NULL OR hpc.管控字段6 = ed.管控字段6) -- AND (hpc.管控字段7 IS NULL OR hpc.管控字段7 = ed.管控字段7) -- AND (hpc.管控字段8 IS NULL OR hpc.管控字段8 = ed.管控字段8) -- 如需查询指定HR的可访问数据,补充WHERE条件即可 -- WHERE hpc.hr_id = '目标HR的ID'
补充说明
DISTINCT作用是避免同一条员工数据匹配到多条权限规则时出现重复输出- 如果你条件表中用
'*'、'ALL'这类特定值代表通配,把对应判断逻辑里的IS NULL替换成对应值判断即可,例如改为hpc.region = 'ALL' OR hpc.region = ed.region - 数据量较大的场景下,可以给条件表的管控字段加索引,提升匹配效率
内容的提问来源于stack exchange,提问作者Chris Sommers
相关产品推荐
相关产品推荐

