使用Mysql数据库的时候由于框架限制需要自定义数据库函数,写了几个数据库函数,简单做个记录吧
-- 启用log_bin_trust_function_creators: 此项操作之前需要检查log_bin_trust_function_creators的值
-- show variables like 'log_bin_trust_function_creators';
-- 结果为OFF执行如下set语句,为ON则不执行set语句
set global log_bin_trust_function_creators=1;
-- 创建将版本信息转换为字符串的函数VerToStr
-- INPUT: VerToStr("V1.02.03.40") OUTPUT: 0001000200030040
DELIMITER //
DROP FUNCTION IF EXISTS VerToStr //
CREATE FUNCTION VerToStr(ver varchar(20))
RETURNS varchar(50)
BEGIN
DECLARE len int;
DECLARE verstr varchar(50);
DECLARE result varchar(50);
SET len=LENGTH(ver)-LENGTH(REPLACE(ver,'.',''));
-- Replace input version V and v
SET verstr=REPLACE(REPLACE(ver,'V',''),'v','');
IF len=0 then
SET result=LPAD(SUBSTRING_INDEX(SUBSTRING_INDEX(verstr, '.', 1), '.', -1), 4, '0');
ELSEIF len=1 then
SET result=CONCAT(LPAD(SUBSTRING_INDEX(SUBSTRING_INDEX(verstr, '.', 1), '.', -1), 4, '0'),LPAD(SUBSTRING_INDEX(SUBSTRING_INDEX(verstr, '.', 2), '.', -1), 4, '0'));
ELSEIF len=2 then
SET result=CONCAT(LPAD(SUBSTRING_INDEX(SUBSTRING_INDEX(verstr, '.', 1), '.', -1), 4, '0'),LPAD(SUBSTRING_INDEX(SUBSTRING_INDEX(verstr, '.', 2), '.', -1), 4, '0'),LPAD(SUBSTRING_INDEX(SUBSTRING_INDEX(verstr, '.', 3), '.', -1), 4, '0'));
ELSE
SET result=CONCAT(LPAD(SUBSTRING_INDEX(SUBSTRING_INDEX(verstr, '.', 1), '.', -1), 4, '0'),LPAD(SUBSTRING_INDEX(SUBSTRING_INDEX(verstr, '.', 2), '.', -1), 4, '0'),LPAD(SUBSTRING_INDEX(SUBSTRING_INDEX(verstr, '.', 3), '.', -1), 4, '0'),LPAD(SUBSTRING_INDEX(SUBSTRING_INDEX(verstr, '.', 4), '.', -1), 4, '0'));
END IF;
RETURN result;
END //
DELIMITER ;
DELIMITER //
-- 获取拆分的某个字符串
-- INPUT: SPLIT_STR("abc_def_ghi",'_',1) OUTPUT: abc
DROP FUNCTION IF EXISTS SPLIT_STR //
CREATE FUNCTION SPLIT_STR(
x VARCHAR(255),
delim VARCHAR(12),
pos INT
) RETURNS VARCHAR(255)
BEGIN
RETURN REPLACE(SUBSTRING(SUBSTRING_INDEX(x, delim, pos),
LENGTH(SUBSTRING_INDEX(x, delim, pos -1)) + 1),
delim, '');
END //
DELIMITER ;
DELIMITER //
-- 获取拆分的个数
-- INPUT: func_get_split_string_total("abc_def_ghi",'_') OUTPUT: 3
DROP FUNCTION IF EXISTS func_get_split_string_total //
CREATE FUNCTION func_get_split_string_total(
f_string varchar(1000),
f_delimiter varchar(5)
) RETURNS int(11)
BEGIN
declare returnInt int(11);
if length(f_delimiter)=2 then
return 1+(length(f_string) - length(replace(f_string,f_delimiter,'')))/2;
else
return 1+(length(f_string) - length(replace(f_string,f_delimiter,'')));
end if;
END //
DELIMITER ;
DELIMITER //
-- 将原字符串拆分成带单引号和逗号连接的字符串
-- INPUT: SPLIT_LINETOOBJECT("abc,def,ghi",',') OUTPUT: 'abd','def','ghi'
DROP FUNCTION IF EXISTS SPLIT_LINETOOBJECT //
CREATE FUNCTION SPLIT_LINETOOBJECT(
x VARCHAR(4000),
delim VARCHAR(12)
) RETURNS VARCHAR(4000)
BEGIN
DECLARE i int;
DECLARE tempStr VARCHAR(260);
DECLARE returnStr VARCHAR(4000);
set i = 1;
set returnStr = "";
if(x is null or length(x)=0) then
return returnStr;
else
while i<=func_get_split_string_total(x,delim)
do
set tempStr = concat("'",SPLIT_STR(x,delim,i),"',");
set returnStr = concat(returnStr,tempStr);
set i = i+1;
end while;
set returnStr = subString(returnStr,1,length(returnStr)-1);
return returnStr;
end if;
END //
DELIMITER ;