SQL:在where子句中被调用时的情况

SQL: Case when being called in a where clause

我正在处理我输入的一个相当大的查询,但我将在此处缩短它。我想要做的是 select 一堆列,然后 运行 一个案例,并使用 where not in 子句来过滤结果,这样我只看到用户被授权的内容。如果我从我的 where 子句中删除 PERM NOT IN 它 returns 用户被授权和未授权的内容,我不想看到它。我不是 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

如果您想让我 post 我会的整个查询,但我不认为它需要整个查询才能获得所需的输出。

我要冒险了,因为我不确定您使用的是 SQL 的哪个变体。通常不能在 WHERE 子句中使用列别名。在我的脑海中,我看到了三个选项:

选项 1 - 使用 "table expression" 从别名生成真实的列名:

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(常用 Table 表达式):

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 - 在 WHERE 子句中再次重复整个 CASE(而不是 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