您的当前位置:首页正文

mysql字符串查找截取与正则表达式的联合应用

2020-11-09 来源:品趣旅游知识分享网

/* 判断字符串里的内容是否是数类型 **************************************************** is_double 输入参数: str: 待分析的字符串 返回: 如果是数类型就返回1,否则返回0 */ DELIMITER $$ DROP FUNCTION IF EXISTS is_double$$ CREATE FUNCTION is_doubl

/* 判断字符串里的内容是否是数值类型 ****************************************************
is_double

输入参数:
str: 待分析的字符串
返回: 如果是数值类型就返回1,否则返回0
*/
DELIMITER $$
DROP FUNCTION IF EXISTS is_double$$
CREATE FUNCTION is_double(str VARCHAR(128))
RETURNS INT
BEGIN
DECLARE iResult INT DEFAULT 0;

/*NULL字符串或者空字符串*/
IF str IS NULL OR str = ''THEN
RETURN 0;
END IF;

SELECT str REGEXP '^[[:digit:]]+$|^[[:digit:]]+[\\.][[:digit:]]+$' INTO iResult;

IF iResult = 1 THEN
RETURN 1;
ELSE
RETURN 0;
END IF;
END $$

DELIMITER ;



/* 分割字符串 ****************************************************
sp_report_string_get_val

功能:分割特定格式的字符串:'3.4,3.2,3.0,2.6,1.0',忽略空值或者是不合法的值
限制:以逗号分割,分割单元以数字组成
结果:分割之后 字符串变为'3.2,3.0,2.6,1.0'和3.4

输入输出参数:
prstring: 要分割的字符串
输出参数:
rval: 从字符串中取得的数值
rcode: 返回代码:0:表示成功执行;1:表示没有取到值或者取到的不是数值
*/
DROP PROCEDURE IF EXISTS sp_get_val;
CREATE PROCEDURE sp_get_val(
INOUT prstring VARCHAR(128),
OUT rval DOUBLE,
OUT rcode INT UNSIGNED
)
BEGIN
DECLARE _pos INT UNSIGNED DEFAULT 1; /*','的位置*/
DECLARE _str VARCHAR(128) DEFAULT ''; /*存放取出的字符串,之后将值赋给返回变量*/

SET rval = NULL;
SET rcode = 0;
/*
1)先去除空格
*/
SET prstring = REPLACE(prstring, ' ', '');
IF prstring = '' THEN
SET rcode = 1;
ELSE
IF RIGHT(prstring, 1) != ',' THEN
SET prstring = CONCAT(prstring, ',');
END IF;

/*
2)找到第一个','
*/
WHILE rval IS NULL AND prstring != '' DO
SET _pos = LOCATE(',', prstring);

IF _pos = 0 THEN
SET rcode = 1;
ELSE
SET _str = SUBSTRING(prstring, 1, _pos - 1);

IF is_double(_str) THEN
SET rval = _str;
END IF;

SET prstring = SUBSTRING(prstring, _pos + 1);
END IF;
END WHILE;
END IF;

IF rval IS NULL THEN
SET rcode = 1;
END IF;
END;



测试:

CREATE TABLE test_1(a DOUBLE);


DELIMITER $$
DROP PROCEDURE IF EXISTS sp_test_3$$
CREATE PROCEDURE sp_test_3()
BEGIN
DECLARE _str VARCHAR(128) DEFAULT '1,4,3.5,3.7,3.22a, , a, 34.2, 0, .1, 0., ';
DECLARE _i DOUBLE DEFAULT 0;
DECLARE _j INT UNSIGNED DEFAULT 0;

WHILE _str != '' DO
CALL sp_get_val(_str, _i, _j);
IF _j = 0 THEN
INSERT INTO test_1 VALUES(_i);
END IF;
END WHILE;
END$$
DELIMITER ;


执行:

CALL sp_test_3();

SELECT * FROM test_1;
TRUNCATE test_1;

显示全文