1.case…when… 用法
参考:
http://www.cnblogs.com/qlqwjy/p/7476533.html
-
CASE
value
WHEN [
compare-value
] THEN
result
[WHEN [
compare-value
] THEN
result
…] [ELSE
result
] END CASE WHEN [
condition
] THEN
result
[WHEN [
condition
] THEN
result
…] [ELSE
result
] END
在第一个方案的返回结果中,
value
=
compare-value
。而第二个方案的返回结果是第一种情况的真实结果。如果没有匹配的结果值,则返回结果为ELSE后的结果,如果没有ELSE 部分,则返回值为 NULL
mysql>
SELECT CASE 1 WHEN 1 THEN ‘one’
->
WHEN 2 THEN ‘two’ ELSE ‘more’ END;
-> ‘one’
mysql>
SELECT CASE WHEN 1>0 THEN ‘true’ ELSE ‘false’ END;
-> ‘true’
mysql>
SELECT CASE BINARY ‘B’
->
WHEN ‘a’ THEN 1 WHEN ‘b’ THEN 2 END;
-> NULL
一个CASE表达式的默认返回值类型是任何返回值的相容集合类型,但具体情况视其所在语境而定。如果用在字符串语境中,则返回结果味字符串。如果用在数字语境中,则返回结果为十进制值、实值或整数值。
例一:
SQL> select u.id,u.name, (case u.sex when 1 then '男' when 2 then '女' else '空的' end )性别 from users u; ID NAME 性别 --------------------------------------- -------------------- ------ 张一 空的 张二 男 张三 空的 张四 空的 张五 女 张六 男 张七 女 张八 男 rows selected
例二:
SELECT g.employeeName, CASE g.employeeType WHEN '0' THEN(SELECT sex FROM employee_in WHERE idCode=g.employeeId) ELSE (SELECT sex FROM employee_out WHERE idCode=g.employeeId) END sex, g.employeeId, g.examMethod, (CASE g.employeeType WHEN '0' THEN '内部员工' WHEN '1' THEN '外部员工' ELSE '空' END)employeeType, CASE g.employeeType WHEN '0' THEN(SELECT department.departmentName FROM employee_in,department WHERE idCode=g.employeeId AND department.departmentId=employee_in.departmentId ) ELSE (SELECT unit.name FROM unit,employee_out WHERE idCode=g.employeeId AND employee_out.unitId=unit.unitId ) END departmentName, CASE g.employeeType WHEN '0' THEN(SELECT employee_in.trainStatus FROM employee_in WHERE idCode=g.employeeId) ELSE (SELECT employee_out.trainStatus FROM employee_out WHERE idCode=g.employeeId) END trainSuatus FROM employeeexam g
2 IF(
expr1
,
expr2
,
expr3
)
如果
expr1
是TRUE (
expr1
<> 0 and
expr1
<> NULL),则 IF()的返回值为
expr2
; 否则返回值则为
expr3
。IF() 的返回值为数字值或字符串值,具体情况视其所在语境而定。
mysql>
SELECT IF(1>2,2,3);
-> 3
mysql>
SELECT IF(1<2,’yes ‘,’no’);
-> ‘yes’
mysql>
SELECT IF(STRCMP(‘test’,’test1′),’no’,’yes’);
-> ‘no’
如果
expr2
或
expr3
中只有一个明确是 NULL,则IF() 函数的结果类型 为非NULL表达式的结果类型。
expr1
作为一个整数值进行计算,就是说,假如你正在验证浮点值或字符串值, 那么应该使用比较运算进行检验。
mysql>
SELECT IF(0.1,1,0);
-> 0
mysql>
SELECT IF(0.1<>0,1,0);
-> 1
在所示的第一个例子中,IF(0.1)的返回值为0,原因是 0.1 被转化为整数值,从而引起一个对 IF(0)的检验。这或许不是你想要的情况。在第二个例子中,比较检验了原始浮点值,目的是为了了解是否其为非零值。比较结果使用整数。
IF() (这一点在其被储存到临时表时很重要 ) 的默认返回值类型按照以下方式计算:
|
|
|
字符串 |
|
浮点 |
|
整数 |
假如
expr2
和
expr3
都是字符串,且其中任何一个字符串区分大小写,则返回结果是区分大小写。
例一:
原来表数据:
查询:
SELECT SUBSTRING(employeeid,1,3) AS id,IF(SUBSTRING(employeeid,4,2)<>'',SUBSTRING(employeeid,5,2),'00') AS TIME,break,unit_id FROM test2
结果:
3.IFNULL(
expr1
,
expr2
)
假如
expr1
不为 NULL,则 IFNULL() 的返回值为
expr1
; 否则其返回值为
expr2
。IFNULL()的返回值是数字或是字符串,具体情况取决于其所使用的语境。
mysql>
SELECT IFNULL(1,0);
-> 1
mysql>
SELECT IFNULL(NULL,10);
-> 10
mysql>
SELECT IFNULL(1/0,10);
-> 10
mysql>
SELECT IFNULL(1/0,’yes’);
-> ‘yes’
IFNULL(
expr1
,
expr2
)的默认结果值为两个表达式中更加“通用”的一个,顺序为STRING、 REAL或 INTEGER。假设一个基于表达式的表的情况, 或MySQL必须在内存储器中储存一个临时表中IFNULL()的返回值:
CREATE TABLE tmp SELECT IFNULL(1,’test’) AS test;
在这个例子中,测试列的类型为 CHAR(4)。
4. NULLIF(
expr1
,
expr2
)
如果
expr1
=
expr2
成立,那么返回值为NULL,否则返回值为
expr1
。这和CASE WHEN
expr1
=
expr2
THEN NULL ELSE
expr1
END相同。
mysql>
SELECT NULLIF(1,1);
-> NULL
mysql>
SELECT NULLIF(1,2);
-> 1
注意,如果参数不相等,则 MySQL 两次求得的值为 expr1 。