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

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

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;


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部