MySQL 函数 ONLY_NUMBERS
MySQL Function ONLY_NUMBERS
如有任何帮助,我们将不胜感激!
我需要 MySQL 中的函数,就像我在 PHP 库中的函数一样,我将其称为 "onlyNumbers",此函数循环所有字符串过滤数字并连接为return 字符串.
我可以遵循 MySQL 语法的逻辑并重现它,如下所示,但是缺少一些东西,我认为是一个技巧,或者一些我没有想到的简单步骤。
当 运行 在 MySQL 中创建函数时,但当我调用它时出现此错误:#2014 - 命令不同步;你现在不能运行这个命令
这是我的函数代码:
如果存在则删除函数 ONLY_NUMBERS;
分隔符 $$
创建函数 ONLY_NUMBERS(_STR TEXT) RETURNS 文本确定性
开始
声明数字文本;
声明 _STR_CHAR CHAR(1) 默认 NULL;
声明 _STR_POS BIGINT(20) 默认值 0;
声明 _STR_INIT BIGINT(20) 默认值 0;
声明 _STR_ENDS BIGINT(20) 默认值 0;
设置 _STR_ENDS = CHAR_LENGTH(_STR);
STRING_LOOP:循环
如果 _STR_POS = STR_ENDS 那么
离开 STRING_LOOP;
万一;
SET _STR_CHAR = SUBSTR(_STR,_STR_POS,1);
IF _STR_CHAT REGEXP '^[0-9]$' 那么
设置数字 = CONCAT(数字,_STR_CHAR);
万一;
SET _STR_POS = _STR_POS + 1;
迭代 STRING_LOOP;
结束循环STRING_LOOP;
RETURN 数字;
结束 $$
分隔符;
当我调用 SELECT ONLY_NUMBERS('sadfasdf3423452345234'); 我期待看到 3423452345234 作为结果
好的,我们开始吧!
经过很多很多次的尝试,终于达到了我的预期!
这是一个 return 仅将字符串中的数字作为参数的函数,我在速度、权重、更少的声明、更少的内存等方面做了一些改进...
这是功能,记住这是使用核心 MySQL 服务器,您不需要安装任何东西:
DROP FUNCTION IF EXISTS ONLY_NUMBERS;
DELIMITER //
CREATE FUNCTION ONLY_NUMBERS(_STR TEXT) RETURNS TEXT DETERMINISTIC
BEGIN
DECLARE _NUMBERS TEXT;
DECLARE _STR_POS BIGINT(20) DEFAULT 0;
DECLARE _STR_ENDS BIGINT(20) DEFAULT 0;
SET _STR_ENDS = CHAR_LENGTH(_STR);
SET _NUMBERS = '';
WHILE _STR_POS <= _STR_ENDS DO
IF SUBSTR(_STR, _STR_POS, 1) REGEXP '^[0-9]$' THEN
SET _NUMBERS = CONCAT(_NUMBERS, SUBSTR(_STR, _STR_POS, 1));
END IF;
SET _STR_POS = _STR_POS + 1;
END WHILE;
RETURN _NUMBERS;
END //
DELIMITER ;
如有任何帮助,我们将不胜感激!
我需要 MySQL 中的函数,就像我在 PHP 库中的函数一样,我将其称为 "onlyNumbers",此函数循环所有字符串过滤数字并连接为return 字符串.
我可以遵循 MySQL 语法的逻辑并重现它,如下所示,但是缺少一些东西,我认为是一个技巧,或者一些我没有想到的简单步骤。
当 运行 在 MySQL 中创建函数时,但当我调用它时出现此错误:#2014 - 命令不同步;你现在不能运行这个命令
这是我的函数代码:
如果存在则删除函数 ONLY_NUMBERS; 分隔符 $$ 创建函数 ONLY_NUMBERS(_STR TEXT) RETURNS 文本确定性 开始 声明数字文本; 声明 _STR_CHAR CHAR(1) 默认 NULL; 声明 _STR_POS BIGINT(20) 默认值 0; 声明 _STR_INIT BIGINT(20) 默认值 0; 声明 _STR_ENDS BIGINT(20) 默认值 0; 设置 _STR_ENDS = CHAR_LENGTH(_STR); STRING_LOOP:循环 如果 _STR_POS = STR_ENDS 那么 离开 STRING_LOOP; 万一; SET _STR_CHAR = SUBSTR(_STR,_STR_POS,1); IF _STR_CHAT REGEXP '^[0-9]$' 那么 设置数字 = CONCAT(数字,_STR_CHAR); 万一; SET _STR_POS = _STR_POS + 1; 迭代 STRING_LOOP; 结束循环STRING_LOOP; RETURN 数字; 结束 $$ 分隔符;
当我调用 SELECT ONLY_NUMBERS('sadfasdf3423452345234'); 我期待看到 3423452345234 作为结果
好的,我们开始吧!
经过很多很多次的尝试,终于达到了我的预期!
这是一个 return 仅将字符串中的数字作为参数的函数,我在速度、权重、更少的声明、更少的内存等方面做了一些改进...
这是功能,记住这是使用核心 MySQL 服务器,您不需要安装任何东西:
DROP FUNCTION IF EXISTS ONLY_NUMBERS;
DELIMITER //
CREATE FUNCTION ONLY_NUMBERS(_STR TEXT) RETURNS TEXT DETERMINISTIC
BEGIN
DECLARE _NUMBERS TEXT;
DECLARE _STR_POS BIGINT(20) DEFAULT 0;
DECLARE _STR_ENDS BIGINT(20) DEFAULT 0;
SET _STR_ENDS = CHAR_LENGTH(_STR);
SET _NUMBERS = '';
WHILE _STR_POS <= _STR_ENDS DO
IF SUBSTR(_STR, _STR_POS, 1) REGEXP '^[0-9]$' THEN
SET _NUMBERS = CONCAT(_NUMBERS, SUBSTR(_STR, _STR_POS, 1));
END IF;
SET _STR_POS = _STR_POS + 1;
END WHILE;
RETURN _NUMBERS;
END //
DELIMITER ;