视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
mysql字符串查找截取与正则表达式的联合应用
2020-11-09 08:31:21 责编:小采
文档


/* 判断字符串里的内容是否是数类型 **************************************************** 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;

下载本文
显示全文
专题