按某字段中的部分数字来排序.
配方名称格式是ZP001,ZP123这样的格式,如何将检索结果按配方名称中ZP后面的数字从小到大(或相反)的顺序排列?
select `配方名称`, `LIPF6` from Maindb where (`配方名称` REGEXP "ZPd+")
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.