我只想返回存储在数据库表的列中的第一个数字。 用户已将页面范围放入“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
但这次我收到了错误。
有什么想法吗?
答案 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的原始帖子
@num := CONVERT(the_field, SIGNED) AS cast_num
#尝试将其转换为数字SUBSTRING(the_field, 1, LOCATE(@num, the_field) + LENGTH(@num) - 1)
#通过使用字段SUBSTRING(the_field, LOCATE(@num, the_field) + LENGTH(@num))
#在数字后面找到字符串的其余部分。值得保留另一个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`;
注意:
the_field
被修剪。否则,请先使用TRIM()。