1.case函数
语法:
CASE
WHEN 判断条件 THEN 值
WHEN 判断条件 THEN 值
WHEN 判断条件THEN 值
ELSE 值
END AS 临时字段名称
样例:
select
username,
sexid,
CASE
WHEN user.sexid=1 THEN '男'
WHEN user.sexid=0 THEN '女'
ELSE '未知'
END AS sexname
from user
解释:查询user表中的username和sexid字段,并创建一个临时字段sexname。判断sexid的值,当sexid等于1的时候,sexname的值就为“男”,等于0的时候,sexname的值为“女”,其他情况则为未知。
2.IF()函数
语法:
IF(判断条件,value1,value2) AS 临时字段名
用法:
select
username,
sexid,
IF(user.sexid=1,'男','女') AS sexname
from user
解释:单if判断只会有两种情况,sexid=1为真,sexname的值就时男,否则就是女
IF()函数嵌套使用
IF(判断条件,值,
IF(判断条件,值,值
)
) AS 临时字段名称
用法:
select
username,
sexid,
IF(user.sexid=1,'男',
IF(user.sexid=0,'女','未知'
)
) AS sexname
from user
解释:当sexid等于1的时候,sexname的值就为“男”,等于0的时候,sexname的值为“女”,其他情况则为未知。会比单if多一次判断
但是,这几种方法都类似于java中的if,else-if,只会用一个值,只要其中一个为真,剩下的就不判断了。如果不管是否为真,每个条件都判断,且这几次的判断结果都放在同一个临时字段怎么办?
需求:
有检定证书是否提交,原始记录是否提交,考试试卷是否提交这三个字段,现在需要判断这三个字段的值,如果哪个提交了就放在临时字段里面,用逗号拼接。
SELECT
CONCAT_WS(',',
CASE
WHEN ba.is_transfer_certificate='1' THEN '检定证书'
END,
CASE
WHEN ba.is_transfer_original='1' THEN '原始记录'
END,
CASE
WHEN ba.is_transter_scores='1' THEN '理论考试试卷'
END ) AS a,
bte.apply_code
FROM bas_test_scores bts
LEFT JOIN bas_archiv ba ON ba.test_scores_id=bts.id
LEFT JOIN bas_train_staff_lesson btsl ON btsl.id=bts.train_staff_lesson_id
LEFT JOIN bas_train_leason btl ON btsl.lesson_id=btl.id
LEFT JOIN bas_enroll_staff bes ON btsl.staff_id=bes.id
LEFT JOIN bas_train_enroll bte ON bes.enroll_id=bte.id
效果:
解释:
每一次判断都重新写一个case when,这样就能实现三个判断都会执行到,每个判断条件都会有对应的值,如果三个判断条件都为真,那么三个值都会通过最外层CONCAT_WS()函数存放在临时字段a里面,并且以指定的分隔符(这里用的逗号)隔开。
concat_ws()函数
功能:一次性指定分隔符
语法:
concat_ws(separator,str1,str2,...)
说明:第一个参数指定分隔符 分隔符不能为空 如果为NULL 则返回值NULL