SQL: случай, когда вызывается в предложении where - PullRequest
0 голосов
/ 27 декабря 2018

Я работаю с довольно большим запросом, который я набрал, но я собираюсь сократить его здесь.То, что я пытаюсь сделать, это выбрать группу столбцов, а затем запустить случай когда и использовать предложение where not in для фильтрации результатов, чтобы я видел только то, что пользователь авторизован.Если я удаляю PERM NOT IN из моего предложения where, он возвращает то, для чего пользователь авторизован и не авторизован, и я не хочу этого видеть.Я не уверен на 100%, если это возможно, и если это можно сделать другим способом или проще, это было бы здорово.

Вот мой запрос:

SELECT 
    usname AS Name, ususer AS Username, usseclevel AS Default_Level, 
    usglsecl AS GL_SecurityLevel, aoopid, aoseclevel
    CASE 
       WHEN aoauopid >= 00500 AND aoAuOpID < 10000 
          THEN
             CASE 
                WHEN usglsecl >= aoseclevel 
                   THEN 'Authorized' 
                   ELSE 'Unauthorized' 
             END
    END AS PERM
FROM
    library.file 
JOIN
    library.file ON usseclevel >= aoseclevel
WHERE 
    ususer NOT IN ('*ALL', 'daffron') 
    AND PERM NOT IN ('Unauthorized, 'null')
ORDER BY 
    ususer

Если вы хотите, чтобы я опубликовал весь мой запрос, я сделаю это, но я не думаю, что для получения желаемого результата требуется весь запрос..

1 Ответ

0 голосов
/ 27 декабря 2018

Я собираюсь выйти на конечность здесь, так как я не уверен, какой вариант SQL вы используете.Обычно вы не можете использовать псевдоним столбца в предложении WHERE.Вверху головы я вижу три варианта:

Вариант 1 - использовать «табличное выражение» для получения истинного имени столбца из псевдонима:

select * from (
  Select usname as Name, ususer as Username, usseclevel as Default_Level, 
  usglsecl as GL_SecurityLevel, aoopid, aoseclevel
  Case When aoauopid >=00500 and aoAuOpID <10000 then case when 
  usglsecl>=aoseclevel then 'Authorized' else 'Unauthorized' end END AS PERM
  from library.file join library.file on usseclevel>=aoseclevel
  WHERE ususer NOT IN('*ALL','daffron') 
) x
WHERE PERM NOT IN('Unauthorized,'null')
ORDER BY ususer

Вариант 2 - использовать CTE (общее табличное выражение):

with x as (
  Select usname as Name, ususer as Username, usseclevel as Default_Level, 
  usglsecl as GL_SecurityLevel, aoopid, aoseclevel
  Case When aoauopid >=00500 and aoAuOpID <10000 then case when 
  usglsecl>=aoseclevel then 'Authorized' else 'Unauthorized' end END AS PERM
  from library.file join library.file on usseclevel>=aoseclevel
  WHERE ususer NOT IN('*ALL','daffron') 
)
select * from x 
WHERE PERM NOT IN('Unauthorized,'null')
ORDER BY ususer

Вариант 3 - повторить весь CASE снова в предложении WHERE (вместо PERM):

Select usname as Name, ususer as Username, usseclevel as Default_Level, 
usglsecl as GL_SecurityLevel, aoopid, aoseclevel
Case When aoauopid >=00500 and aoAuOpID <10000 then case when 
usglsecl>=aoseclevel then 'Authorized' else 'Unauthorized' end END AS PERM
from library.file join library.file on usseclevel>=aoseclevel
WHERE ususer NOT IN('*ALL','daffron') 
and Case When aoauopid >=00500 and aoAuOpID <10000 then case when 
usglsecl>=aoseclevel then 'Authorized' else 'Unauthorized' end END
    NOT IN('Unauthorized,'null')
ORDER BY ususer
...