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
我正在处理我输入的一个相当大的查询,但我将在此处缩短它。我想要做的是 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