Sql 如何从列中搜索条件?

Sql 如何从列中搜索条件?,sql,db2,Sql,Db2,我创建了两个表,并将其命名为角色和访问控制。每个ACCESS\u CONTROL用户可以在允许的\u角色中有多个角色,用逗号分隔 角色 访问控制 USER_ID USER ALLOWABLE_ROLES A001 MASTER P009,P011,P012,P010,P006,P005,P001 A002 ADMIN 1 P010,P011,P012,P003,P004,P006,P

我创建了两个表,并将其命名为角色和访问控制。每个ACCESS\u CONTROL用户可以在允许的\u角色中有多个角色,用逗号分隔

角色

访问控制

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 
我试图通过在SQL中使用CONCAT将允许的_ROLES列值从这个P009、P011、P012、P010、P006、P005、P001更改为这个“P009”、“P011”、“P012”、“P010”、“P006”、“P005”、“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 
有没有可能直接从列中获取输出

SELECT R.*
FROM ROLES R
JOIN ACCESS_CONTROL A ON LOCATE(','||R.ROLE_ID||',', ','||A.ALLOWABLE_ROLES||',')<>0
WHERE A.USER_ID = 'A001'

+在MSSQL 2017中,您可以使用字符串分割函数:

挑选 角色ID, 角色名称 从…起 字符串分割中的角色 哪里 从字符串中选择值中的角色\u ID选择前1个允许的\u角色,其中用户\u ID='A001'


但是,在MS2016之前,您可以使用上所述的函数。您是否检查了SELECT CONCAT、CONCATTRIMCHARRETERPLACEU ROLES、CONCATTRIMCHARREACEU ROLES、CONCATTRIMCHARREATES、CONCATTRIMCHARREATES、CONCATREPLACEU ROLES的值,是的,我已经运行了查询,它的输出是:“P009”、“P011”、“P012”、“P010”、“P006”、“P005”和“P001”。您应该避免在所有大写中键入,即使只是标题。这是一个恼人的问题,因为它很难阅读,b它被认为是对你的观众大喊大叫,这真的很粗鲁。对不起,我只是改变了它,修正了数据模型!SQL不是为在字符串中存储多个值而设计的。它旨在将多个值存储在表中的单独行中。
SELECT R.*
FROM ROLES R
JOIN ACCESS_CONTROL A ON LOCATE(','||R.ROLE_ID||',', ','||A.ALLOWABLE_ROLES||',')<>0
WHERE A.USER_ID = 'A001'