SELECT order_id, IFNULL(shipper_id, 'Not Assigned') AS shipper FROM orders;
IF
IF() 函数可以根据条件返回不同结果,例如:
SELECT order_id, order_date, IF( YEAR(order_date) =YEAR(NOW()), 'Active', 'Archive' ) AS status FROM orders;
-- 更复杂的例子 SELECT product_id, p.`name`, COUNT(*) AS orders, IF(COUNT(*) >1,'Many times','Once') AS frequency FROM `order_items` oi JOIN products p USING(product_id) GROUPBY product_id
CASE 运算符
我们上面使用了 IF 来根据条件返回不同结果,如果有多个可能性该怎么办呢?我们可以使用 CASE 运算符:
SELECT order_id, CASE WHENYEAR(order_date) =YEAR(NOW()) THEN'Active' WHENYEAR(order_date) =YEAR(NOW()) -1THEN'Last Year' WHENYEAR(order_date) <YEAR(NOW()) -1THEN'Archive' ELSE'Future' ENDAS category FROM orders;
CASE 运算符常用于行转列,例如原表为:
student_name
course
score
张三
数学
71
张三
语文
93
李四
数学
82
李四
语文
96
王五
数学
87
王五
语文
84
王五
英语
90
希望转为下列形式:
student_name
math
chinese
english
张三
71
93
0
李四
82
96
0
王五
87
84
90
SELECT student_name, MAX(CASE course WHEN'数学'THEN score ELSE0END) AS math, MAX(CASE course WHEN'语文'THEN score ELSE0END) AS chinese, MAX(CASE course WHEN'英语'THEN score ELSE0END) AS english FROM report_card GROUPBY student_name;