我创建了两个表,并将其命名为ACCESS_CONTROL和角色。每个ACCESS_CONTROL用户可以在ALLOWABLE_ROLES中使用逗号分隔多个角色。
角色
ROLE_ID ROLE_NAME
P001 ROLE 1
P002 ROLE 2
P003 ROLE 3
P004 ROLE 4
P005 ROLE 5
P006 ROLE 6
P007 ROLE 7
P008 ROLE 8
P009 ROLE 9
P010 ROLE 10
P011 ROLE 11
P012 ROLE 12 ACCESS_CONTROL
USER_ID USER ALLOWABLE_ROLES
A001 MASTER P009,P011,P012,P010,P006,P005,P001
A002 ADMIN 1 P010,P011,P012,P003,P004,P006,P008
A003 ADMIN 2 P011,P012,P010,P006
A005 ADMIN 3 P011,P012,P003,P007,P006,P009,P001,P005
A006 USER 1 P011,P012,P001,P006
A007 USER 2 P010,P011,P012,P003,P006,P001,P000,P002 我试图通过将列ALLOWABLE_ROLES值从P009、P011、P012、P010、P006、P005、P001更改为‘P 009’、‘P 011’、‘P 012’、‘P 010’、‘P 006’、‘P 005’、'P001‘,从而获得用户角色列表。
SELECT
ROLE_ID,
ROLE_NAME
FROM
ROLES
WHERE
ROLE_ID IN (SELECT CONCAT('''',CONCAT(RTRIM(CHAR(REPLACE(ALLOWABLE_ROLES,',',''','''))),'''')) FROM ACCESS_CONTROL WHERE USER_ID = 'A001')然而,结果返回零。
但当我碰碰运气的时候,
SELECT
ROLE_ID,
ROLE_NAME
FROM
ROLES
WHERE
ROLE_ID IN ('P009','P011','P012','P010','P006','P005','P001')结果输出显示
结果
ROLE_ID ROLE_NAME
P001 ROLE 1
P005 ROLE 5
P006 ROLE 6
P009 ROLE 9
P010 ROLE 10
P011 ROLE 11
P012 ROLE 12 有可能直接从列获得输出吗?
发布于 2018-10-06 08:33:41
SELECT R.*
FROM ROLES R
JOIN ACCESS_CONTROL A ON LOCATE(','||R.ROLE_ID||',', ','||A.ALLOWABLE_ROLES||',')<>0
WHERE A.USER_ID = 'A001'+1给保罗的评论。
发布于 2018-10-06 08:41:15
在MSSQL 2017中,您可以使用STRING_SPLIT函数:
选择ROLE_ID,ROLE_NAME从STRING_SPLIT中的角色中选择ROLE_ID IN (从STRING_SPLIT中选择value (选择USER_ID =‘A001’)的前1 ALLOWABLE_ROLES )
但是,在MS2016之前,您可以使用已在How to split a comma-separated value to columns上描述的函数
https://stackoverflow.com/questions/52675908
复制相似问题