关于mysql中判断赋值语句的返回值是真还是假
by 老头子
实验环境:
测试DB版本:5.6.27
测试DB库:employees
实验目的:
在mysql中实现Oracle的分析函数功能。如:row_numberover()
实验过程:
使用自定义变量自增,虚拟一个列。
如果emp_no与变量priv相等,则取变量rn_count的值
否则将emp_no的值赋值给变量priv,且rn_count自增1。
由于这里不是用的if else,是用的是两个场景的case when,当不满足第一个case when的时候则强迫第二个case when的条件为真@priv := emp_no.
但在做第二个场景测试时发现了一些异常,如果字段为char类型,则会出现问题。
场景1:对int类型的字段emp_no进行排序
实验脚本:
SELECT
dept_no,
emp_no,
CASE
WHEN@priv = emp_no THEN @rn_count
WHEN@priv:=emp_no THEN @rn_count:=@rn_count + 1
END AS RN
FROM
dept_manager t,
(SELECT@rn_count:=0, @priv:=NULL) p
ORDER BY emp_no;
实验结果:成功
场景2:对char类型的字段dept_no进行排序
实验脚本:
SELECT
dept_no,
CASE
WHEN@priv = dept_no THEN @rn_count
WHEN@priv:=dept_no THEN @rn_count:=@rn_count + 1
END AS RN
FROM
dept_manager t,
(SELECT@rn_count:=0, @priv:=NULL) p
ORDER BY dept_no;
实验结果:失败
场景3:对char类型的字段dept_no处理后进行排序
实验脚本:
SELECT
dept_no,
CASE
WHEN@priv = dept_no THEN @rn_count
WHENHEX(CONCAT(@priv:=dept_no, 1)) THEN @rn_count:=@rn_count + 1
END AS RN
FROM
dept_manager t,
(SELECT@rn_count:=0, @priv:=NULL) p
ORDER BY dept_no;
实验结果:成功
场景4:对date类型的字段to_date进行排序
实验脚本:
SELECT
to_date,
CASE
WHEN@priv = to_date THEN @rn_count
WHEN@priv:=to_date THEN @rn_count:=@rn_count + 1
END AS RN
FROM
dept_manager t,
(SELECT@rn_count:=0, @priv:=NULL) p
ORDER BY to_date desc;
实验结果:成功
实验结果:
赋值表达式返回为真:
Int、date等类型可以直接判断,返回结果为真。
赋值表达式返回为假:
Char、varchar、enum等字符类型则会发生隐式转换,返回结果为假。
当使用类似功能进行业务实现的时候,建议:
1. 处理第二个case when的条件永远为真
2. 使用if
3. 表设计时,case when的判断条件字段为数字类型