如何使用MySQL查询在文本字段中查找第一个数字?

时间:2012-02-22 12:55:20

标签: mysql regex

我只想返回存储在数据库表的列中的第一个数字。 用户已将页面范围放入“p.2-5”或“第2页到第5页”或“2 - 5”等字段中。 我对这里的'2'感兴趣。

我试过

  SELECT SUBSTR(the_field, LOCATE('2', the_field, 1)) AS 'the_number'
  FROM the_table

它有效。但如何获得任何数字?

我试过

  SELECT SUBSTR(the_field, LOCATE(REGEXP '[0-9], the_field, 1)) AS 'the_number'
  FROM the_table

但这次我收到了错误。

有什么想法吗?

4 个答案:

答案 0 :(得分:0)

REGEXP不是MySQL中的函数,而是运算符。如果字段与正则表达式匹配,则返回1;如果字段匹配,则返回0。你不能用它来计算字符串中的位置。

用法:

mysql> SELECT 'Monty!' REGEXP '.*';
    -> 1

至于问题的答案:我认为只有使用MySQL才能做到这一点的简单方法。最好在代码中处理该字段,或在插入之前提取值。

答案 1 :(得分:0)

针对问题中的具体情况。字符串是{number} {string} {number} 有一个简单的解决方案来获得第一个数字。在我们的例子中,我们有1/2,3之类的数字 4-10 1,2  我们正在寻找每一行的第一个数字。

事实证明,对于这种情况,可以使用convert函数将其转换为数字。 MySQL将返回第一个数字

select convert(the_field ,SIGNED) as the_first_number from the_table

或更多的核心将是

SELECT
the_field,
@num := CONVERT(the_field, SIGNED) AS cast_num,
SUBSTRING(the_field, 1, LOCATE(@num, the_field) + LENGTH(@num) - 1) AS num_part,
SUBSTRING(the_field, LOCATE(@num, the_field) + LENGTH(@num)) AS txt_part
FROM the_table;

这是Eamon Daly source的原始帖子

它做了什么?

  1. @num := CONVERT(the_field, SIGNED) AS cast_num#尝试将其转换为数字
  2. SUBSTRING(the_field, 1, LOCATE(@num, the_field) + LENGTH(@num) - 1)#通过使用字段
  3. 中@num的长度和位置来获取数字
  4. SUBSTRING(the_field, LOCATE(@num, the_field) + LENGTH(@num))#在数字后面找到字符串的其余部分。
  5. 未来使用的一些想法

    值得保留另一个column,在将其插入数据库之前解析它之后将保留第一个数字。实际上这就是我们现在正在做的事情。

    修改

    刚刚看到你有p.2-5之类的文字......这意味着上面的内容无法正常工作,好像字符串不是以数字convert返回零开始

答案 2 :(得分:0)

我所知道的没有内置方式,但是这里有一个你可以定义的Mysql函数,这样做(我没有编写减号或非整数的代码) ,但当然可以加上这些。)

创建后,您可以像使用其他任何功能一样使用它:

SELECT firstNumber(the_field) from the_table;

以下是代码:

DELIMITER //
CREATE FUNCTION firstNumber(s TEXT)
    RETURNS INTEGER
    COMMENT 'Returns the first integer found in a string'
    DETERMINISTIC
    BEGIN

    DECLARE token TEXT DEFAULT '';
    DECLARE len INTEGER DEFAULT 0;
    DECLARE ind INTEGER DEFAULT 0;
    DECLARE thisChar CHAR(1) DEFAULT ' ';

    SET len = CHAR_LENGTH(s);
    SET ind = 1;
    WHILE ind <= len DO
        SET thisChar = SUBSTRING(s, ind, 1);
        IF (ORD(thisChar) >= 48 AND ORD(thisChar) <= 57) THEN
            SET token = CONCAT(token, thisChar);
        ELSEIF token <> '' THEN
            SET ind = len + 1;
        END IF;
        SET ind = ind + 1;
    END WHILE;

    IF token = '' THEN
        RETURN 0;
    END IF;

    RETURN token;

    END //
DELIMITER ;

答案 3 :(得分:0)

只需使用REGEXP_SUBSTR()

SELECT REGEXP_SUBSTR(`the_field`,'^[0-9]+') AS `the_number` FROM `the_table`;

注意:

  1. 我正在使用MySQL Server v8.0。
  2. 此模式假定the_field被修剪。否则,请先使用TRIM()。