丁祥欢
MySQL用法几则(自用)
2021-6-3 12:40
阅读:2105
  1.  按某字段中的部分数字来排序.

    配方名称格式是ZP001,ZP123这样的格式,如何将检索结果按配方名称中ZP后面的数字从小到大(或相反)的顺序排列?

select `配方名称`, `LIPF6` from Maindb where (`配方名称` REGEXP "ZP\\d+") 
ORDER BY cast(substring(`配方名称`,3,3) as UNSIGNED) desc

where子句限定返回的结果是ZP+数字这样的格式,正则表达式的反斜杠要用两根表示.(一根是正则引擎用,一根被MySQL消耗了).

Order by子句后面的是灵魂,先用substring函数(与MID用法相同)提取字串,这样得到的是字符串,如果排序还是按字母排的,如111在20之前. 必须将它转化成数字,所以外面再套一个CAST函数将其转化为无符号整型,这样就可以比较了. 注意as写在括号内.

用法见MySQL的官方说明.   

https://dev.mysql.com/doc/refman/8.0/en/built-in-function-reference.html

https://dev.mysql.com/doc/refman/8.0/en/type-conversion.html


2. REGEXP类函数

有意思的是,在MySQL中,REGEXP或RLIKE 是函数REGEXP_Like()的同义词.

Regexp_like函数除了第1参数是字串,第2参数是正则模式外,还可以设置第三个参数,类型是字串,如i表示大小写不敏感(此为函数的默认模式), c表示大小写敏感,m表示匹配多行,n允许 号匹配终止符而不是行末.如果第三参数中有冲突的选项,以最右边的为准. 

MySQL中其它涉及正则表达式的函数还有: REGEXP_Instr, REGEXP_Replace, REGEXP_substring.

今天才发现,原来SQLite也支持REGEXP操作符的.

 见https://www.sqlite.org/lang_expr.html. 所以上面第1则在SQLITE数据库环境下也可以运行,不过转义的反斜杠用一根就行了.


3. 流程控制结构.

举例来说比较容易懂

select case  "B" when "a" then "Apple"  when "b" then "Bed"  else "Nothing" end;

返回结果为 Bed.

除了上面的Case..(when..then...)+..else..end结构外,还有一些可用的判断函数if, ifnull, nullif

比如

 SELECT IF(1<2,'yes','no');

返回结果yes. 这个用法与Excel里面的函数一样. 前面是条件真的结果,后面是条件假的结果.


IFNULL(expr1,expr2) 如果 expr1 非空, 则 IFNULL() 返回 expr1; 否则返回 expr2.

NULLIF(expr1,expr2) 如果 expr1 = expr2 则返回NULL, 否则返回expr1. NULLIF 与以下语句效果相同.

 CASE WHEN expr1 = expr2 THEN NULL ELSE expr1 END.

转载本文请联系原作者获取授权,同时请注明本文来自丁祥欢科学网博客。

链接地址:https://m.sciencenet.cn/blog-1213210-1289527.html?mobile=1

收藏

分享到:

当前推荐数:0
推荐到博客首页
网友评论0 条评论
该博文不允许评论
确定删除指定的回复吗?
确定删除本博文吗?