SQL 使用CASE表达式标记行数据,你想把某列的值映射成一系列的“布尔”标志位。例如,对于 EMP
表的 JOB
列,你希望得到如下所示的结果集。
SQL 使用CASE表达式标记行数据 问题描述
你想把某列的值映射成一系列的“布尔”标志位。例如,对于 EMP
表的 JOB
列,你希望得到如下所示的结果集。
ENAME IS_CLERK IS_SALES IS_MGR IS_ANALYST IS_PREZ
------ -------- -------- ------ ---------- -------
KING 0 0 0 0 1
SCOTT 0 0 0 1 0
FORD 0 0 0 1 0
JONES 0 0 1 0 0
BLAKE 0 0 1 0 0
CLARK 0 0 1 0 0
ALLEN 0 1 0 0 0
WARD 0 1 0 0 0
MARTIN 0 1 0 0 0
TURNER 0 1 0 0 0
SMITH 1 0 0 0 0
MILLER 1 0 0 0 0
ADAMS 1 0 0 0 0
JAMES 1 0 0 0 0
类似上述这样的结果集在调试程序的时候往往很有用,并且它也提供了一种不同于普通结果集的数据视图。
SQL 使用CASE表达式标记行数据 解决方案
使用 CASE
表达式评估每个员工的 JOB
值,并返回 1 或 0 以标记评估结果。我们需要写一组 CASE
表达式为每一种可能的 JOB
值创建一列返回值。
1 select ename,
2 case when job = 'CLERK'
3 then 1 else 0
4 end as is_clerk,
5 case when job = 'SALESMAN'
6 then 1 else 0
7 end as is_sales,
8 case when job = 'MANAGER'
9 then 1 else 0
10 end as is_mgr,
11 case when job = 'ANALYST'
12 then 1 else 0
13 end as is_analyst,
14 case when job = 'PRESIDENT'
15 then 1 else 0
16 end as is_prez
17 from emp
18 order by 2,3,4,5,6
SQL 使用CASE表达式标记行数据 扩展知识
本解决方案的代码非常易于理解。如果你还是不太理解的话,不妨把 JOB
列也放入到 SELECT
子句里。
select ename,
job,
case when job = 'CLERK'
then 1 else 0
end as is_clerk,
case when job = 'SALESMAN'
then 1 else 0
end as is_sales,
case when job = 'MANAGER'
then 1 else 0
end as is_mgr,
case when job = 'ANALYST'
then 1 else 0
end as is_analyst,
case when job = 'PRESIDENT'
then 1 else 0
end as is_prez
from emp
order by 2
ENAME JOB IS_CLERK IS_SALES IS_MGR IS_ANALYST IS_PREZ
------ --------- -------- -------- ------ ---------- -------
SCOTT ANALYST 0 0 0 1 0
FORD ANALYST 0 0 0 1 0
SMITH CLERK 1 0 0 0 0
ADAMS CLERK 1 0 0 0 0
MILLER CLERK 1 0 0 0 0
JAMES CLERK 1 0 0 0 0
JONES MANAGER 0 0 1 0 0
CLARK MANAGER 0 0 1 0 0
BLAKE MANAGER 0 0 1 0 0
KING PRESIDENT 0 0 0 0 1
ALLEN SALESMAN 0 1 0 0 0
MARTIN SALESMAN 0 1 0 0 0
TURNER SALESMAN 0 1 0 0 0
WARD SALESMAN 0 1 0 0 0