字符串函数

replace

replace(s,s1,s2),替换函数,用s2替换s中的s1,例如:

-- 结果是1bc
SELECT REPLACE("abc","a","1"); 

group_concat

group_concat(要连接的字段),mysql在group by某个字段时候,其列的字段也只被保存一个值,有时候希望其它列的字段,全部被保留,就可以用这个函数,例如

-- 是用英文的,分割
SELECT GROUP_CONCAT(id) FROM o2o_admin_info WHERE id < 100 GROUP BY status ; 

l6ygdi6g.png
需要注意的是,group_concat的最大长度是1024,超过的这个长度的会丢失,可以修改配置文件,来修改这个长度

[mysqld]
group_concat_max_len = 102400

concat

concat(str1,str2,...) ,将多个字符串连接成一个字符串

concat_ws

concat_ws('分隔符',str1,str2) 第一个参数为分隔符,相比于concat函数可以一次性指定分隔符,例如

-- a、b、c用逗号隔开,结果:a,b,c
SELECT CONCAT_WS(",","a","b","c");

instr

函数instr(filed,str),作用是返回str子字符串在filed字符串的第一次出现的位置。

-- 返回2,位置是从1开始
SELECT INSTR("abc",'b'); 

当instr(filed,str)=0时,表示子符串str不存在于字符串filed中,因此可以用来实现mysql中的模糊查询,与like用法类似。如下:

instr(filed,str) > 0 ⇒ file like '%str%'
instr(filed,str) = 1 ⇒ file like  'str%'
instr(filed,str) = 0 ⇒ file not like  '%str%'

find_in_set

有时候数据库字段的值是用英文,分开的结构,如果想要查找包含某个值的,就需要用到这个函数,例如:

-- 查收sub_menu_id字段中,包含1的这个值的数据
SELECT * FROM o2o_admin_role_purview WHERE FIND_IN_SET(1,sub_menu_id);

l6yhdoyw.png

控制流函数

if

IF(true,a,b),如果为真,则返回a,否则,返回b,例如:

-- 返回0<1
SELECT IF(0>1,'0>1','0<1');

ifnull

ifnull(expression1,expression2),如果expression1不为null,则返回expression1,否则返回expression2,例如

-- 类似php的null合并运算符: null??'不是null',返回'不是null'
SELECT IFNULL(null,'不是null'); 

case语句

字段相对比较,这种语法只能比较是否相等,例如:

select 
    case order_type
       when 1 then 'RMA单'
       when 2 then '维修入库单'
       when 3 then '维修出库单'
       else '类型不正确'
    end 
    as 订单类型
from erp_storage_flow_log where id < 100;

字段比较,不仅仅可以比较是否相等

select 
    case 
       when order_type < 2 then '维修入库单'
       when order_type >= 3 then '维修出库单'
       else '类型不正确'
    end 
    as 订单类型
from erp_storage_flow_log where id < 100;

日期时间函数

from_unixtime

可以把时间戳格式化成日期格式

-- 返回2022-08-18 11:48:08
SELECT FROM_UNIXTIME(1660794488);

NOW()

命令用于显示当前年份,月份,日期,小时,分钟和秒。如:2022-10-28 14:39:05

CURRENT_DATE()

仅显示当前年份,月份和日期。如:2022-10-28

TIMESTAMPDIFF

计算日期相差的秒数

SELECT
    uto_convert_logs.convert_at,
    uto_show_logs.show_at,
    uto_convert_logs.upload_convert_at,
    TIMESTAMPDIFF(SECOND,uto_show_logs.show_at,uto_convert_logs.convert_at) AS seconds_difference
FROM
    uto_convert_logs
inner join uto_show_logs on
    uto_show_logs.outer_show_id = uto_convert_logs.outer_show_id
WHERE
    uto_convert_logs.plan_id = 839738
    and upload_convert_at > 0
    and upload_convert_at >= '2024-07-17 00:00:00'
    and upload_convert_at <= '2024-07-17 23:59:59'
    ;

Json 函数

json_contains

用于查询 json 文档是否在指定 path 包含指定的数据,包含则返回1,否则返回O。如果有参数为NULL或path不存在,则返回NULL。

判断 json 对象的 location 是否等于位置1

select
    json_contains('{
    "location":"位置1",
    "purchaseTime":"2022-07-04",
    "assetsTypeName":"CPU",
    "useDepartment":"测试部",
    "strId":11
}', '"位置1"', '$.location') ;

json_contains主要有三个值:分别是json对象、值、json的具体key值(可缺省)。如果第一个参数已经是想比对的json,则可以省略第三个参数:

select json_contains('[1,2]', '1') ;

如果要同时包含1和2

select json_contains('[1,2]', json_array(1,2)) ;
-- 或
select json_contains('[1,2]', cast('[1,2]' as json)) ;

-- 简单
json_contains('[1,2,3]', '[1,2]')

json_extract

这个函数用于获取 json 对象里的值。

提取某个字段的值,如下获取 b 字段值

select json_extract('{"a":1,"b":2}','$.b'); 

如果字段的值是个数组,可以获取数组里的某个元素的值:

-- 输出2,index下标是从0开始
select json_extract('{"a":[1,2,3],"b":22}','$.a[1]'); 

如果字段的值是个对象,可以获取该字段对象的所有值,返回的个数组,如下获取 a 字段的所有值

-- 输出["42", "zhangsan"]
select json_extract('{"a":{"name":"zhangsan","age":"42"},"b":22}','$.a.*'); 

为了方便操作,从 mysql5.7.9 开始,可以使用字段名->$.keyname.keyname......操作

select tag_ids->'$.a' from topic_tag_relate where 1; 

更多函数见:https://dev.mysql.com/doc/heatwave/en/mys-hw-json-functions.html

拓展

http://c.biancheng.net/mysql/function/

最后修改:2024 年 07 月 24 日
如果觉得我的文章对你有用,请随意赞赏