Как мне найти условие IN из столбца? - PullRequest
0 голосов
/ 06 октября 2018

Я создал две таблицы и назвал их ROLES и ACCESS_CONTROL.Каждый пользователь ACCESS_CONTROL может иметь много ROLES в ALLOWABLE_ROLES, разделенных запятой.

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 

Я пытаюсь получить список ROLES, которые есть у пользователяизменив значение столбца ALLOWABLE_ROLES с этого P009, P011, P012, P010, P006, P005, P001 на это P009, P011, P012, P010, P006, P005, P001использование CONCAT в SQL.

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 

Можно ли получить вывод непосредственно из столбца?

Ответы [ 2 ]

0 голосов
/ 06 октября 2018

В MSSQL 2017 вы можете использовать функцию STRING_SPLIT:

ВЫБРАТЬ ROLE_ID, ROLE_NAME ИЗ РОЛЕЙ В STRING_SPLIT, ГДЕ ROLE_ID IN (выберите значение из STRING_SPLIT (выберите верхнюю 1 ALLOWABLE_ROLES, где USER_ID = 'A001'))

1004 * Но, до MS2016 вы можете использовать функцию, описанную в Как разделить запятую в столбцах
0 голосов
/ 06 октября 2018
SELECT R.*
FROM ROLES R
JOIN ACCESS_CONTROL A ON LOCATE(','||R.ROLE_ID||',', ','||A.ALLOWABLE_ROLES||',')<>0
WHERE A.USER_ID = 'A001'

+ 1 К комментарию Павла.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...