关于mysql中判断赋值语句的返回值是真还是假

浏览: 2959

关于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;

 

实验结果:成功

 Clipboard Image.png

场景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;

 

实验结果:失败

 Clipboard Image.png

场景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;

实验结果:成功

Clipboard Image.png

场景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;

实验结果:成功

Clipboard Image.png

实验结果:

赋值表达式返回为真:

Int、date等类型可以直接判断,返回结果为真。

 

赋值表达式返回为假:

Char、varchar、enum等字符类型则会发生隐式转换,返回结果为假。

 

当使用类似功能进行业务实现的时候,建议:

1.      处理第二个case when的条件永远为真

2.      使用if

3.      表设计时,case when的判断条件字段为数字类型

推荐 3
本文由 老头子 创作,采用 知识共享署名-相同方式共享 3.0 中国大陆许可协议 进行许可。
转载、引用前需联系作者,并署名作者且注明文章出处。
本站文章版权归原作者及原出处所有 。内容为作者个人观点, 并不代表本站赞同其观点和对其真实性负责。本站是一个个人学习交流的平台,并不用于任何商业目的,如果有任何问题,请及时联系我们,我们将根据著作权人的要求,立即更正或者删除有关内容。本站拥有对此声明的最终解释权。

2 个评论

厉害
受教

要回复文章请先登录注册