Case函数
1.Case函数
可以在SQL语句中实现“IF-THEN-ELSE”逻辑计算功能
有两种形式:simple case和searched case
simple case的语法结构:
CASE value
WHEN [compare_value] THEN result
[WHEN [compare_value] THEN result …]
[ELSE result] END
语义:将case后面的值value分别和每个when子句后面的值compare_value进行相等比较,一旦和某个when子句后面的值相等则返回相应的then子句后面的值result。如果和所有when子句后面的值都不相等,则返回else子句后面的值。没有else部分则返回null
value可以是字面量、表达式或者列名
CASE表达式的数据类型取决于跟在then或else后面的表达式的类型。这些类型必须相同(可尝试做隐式类型转换)。否则出错
SELECT CASE 1
WHEN 1 THEN ‘one’
WHEN 2 THEN ‘two’
ELSE ‘more’ END result;
得到1980年后加入俱乐部的球员的号码、性别和名字。性别必须显示为“Female”或者“Male”
SELECT playerno,
CASE sex
WHEN ‘F’ THEN ‘Female’
ELSE ‘Male’ END sex,
NAME
FROM players
WHERE joined > 1980;
Searched case的语法结构:
CASE
WHEN [condition] THEN result
[WHEN [condition] THEN result …]
[ELSE result] END
语义:如果某个when子句后面的条件condition为true,则返回相应的when子句后面的值result。如果所有的when子句后面的条件condition都不为true,则返回else子句后面的值。没有else部分则返回null
例5.22 查找每个球员的编号、加入年份以及球员的年龄组
SELECT playerno,joined,
CASE
WHEN joined < 1980 THEN ‘青年组’
WHEN joined < 1983 THEN ‘少年组’
ELSE ‘儿童组’ END AS age_group
FROM players
ORDER BY joined;
Case表达式可以嵌套:
SELECT playerno,town,birth_date,
CASE town
WHEN ‘Stratford’ THEN
CASE birth_date
WHEN ‘1948-09-01’ THEN ‘old Stratford’
ELSE ’ young Stratford’ END
WHEN ‘Inglewood’ THEN
CASE birth_date
WHEN ‘1962-07-08’ THEN ‘old Inglewood’
ELSE ’ young Inglewood’ END
ELSE ‘Rest’ END AS TYPE
FROM players;
Case col1
When then
When then
[else]
整个流程:当col1满足第一个when条件时,返回then字句的信息,如果所有的when条件都不满足则返回else字句的信息,如果没有else字句则返回空