使用MySQL从字符串返回一个浮点数

时间:2013-01-18 16:32:41

标签: mysql sql string floating-point

如果我有类似于mutable的表,例如,使用这种数据:

id size
1  100ml
2  30ml
3  6,7g
4  8,8kg
5  alfa 110v
6  beta 220v

如何提取字符串的数量并将其转换为浮点数。 (在这种情况下,,将小数部分与整数1分开。

那么,如何执行查询以返回这样的内容?:

id size       finalSize
3  6,7g       6,7
4  8,8kg      8,8
2  30ml       30
1  100ml      100
5  alfa 110v  110
6  beta 220v  220

这个? (只是id`s):

id
3
4
2
1
5
6

P.S。:我需要用MySQL函数来做这个......

P.S.:2 我已经尝试使用MySQL搜索匹配正则表达式,但看起来没有函数来返回匹配的模式。 也许如果我创建一个替换不是数字的everthing的函数,或者,可以解决我的问题,但我找不到办法做到这一点。 MYSQL REPLACE函数不使用正则表达式。

4 个答案:

答案 0 :(得分:4)

以下是一个基于函数的解决方案:The function was readily available in one of thes posts.所以我只更改了comma添加到列表中,因为它运行良好:)

查询:

select id, size,
  replace(STRIP_NON_DIGIT(size),',','.')
  as final
from demo
;

功能:

CREATE FUNCTION STRIP_NON_DIGIT(input VARCHAR(255))
   RETURNS VARCHAR(255)
BEGIN
   DECLARE output   VARCHAR(255) DEFAULT '';
   DECLARE iterator INT          DEFAULT 1;
   WHILE iterator < (LENGTH(input) + 1) DO
      IF SUBSTRING(input, iterator, 1) IN (',', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' ) THEN
         SET output = CONCAT(output, SUBSTRING(input, iterator, 1));
      END IF;
      SET iterator = iterator + 1;
   END WHILE;   
   RETURN output;
END//

结果:

| ID |      SIZE | FINAL |
--------------------------
|  3 |      6,7g |   6.7 |
|  4 |     8,8kg |   8.8 |
|  2 |      30ml |    30 |
|  1 |     100ml |   100 |
|  5 | alfa 110v |   110 |
|  6 | beta 220v |   220 |

正如您自己提到的,MYSQL没有像regex_replace这样的Oracle。除非您想使用多个replaces(不想假设多少),否则功能将为您派上用场。

答案 1 :(得分:1)

试试这个

     SELECT size,
     @num := CONVERT(size, SIGNED) AS num_part,
     SUBSTRING(size, LENGTH(@num) + 1) AS rest_of_string 
     FROM your_table;

答案 2 :(得分:0)

功能很棒bonCodigo !!!,但我想报告此修改以简化工作:

DELIMITER $$
DROP FUNCTION IF EXISTS `EXTRACT_NUMBER`$$

DELIMITER $$
CREATE FUNCTION EXTRACT_NUMBER(input VARCHAR(255))
   RETURNS VARCHAR(255)
BEGIN
   DECLARE output   VARCHAR(255) DEFAULT '';
   DECLARE iterator INT          DEFAULT 1;
   WHILE iterator < (LENGTH(input) + 1) DO
      IF SUBSTRING(input, iterator, 1) IN (',', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' ) THEN
         SET output = CONCAT(output, SUBSTRING(input, iterator, 1));
      END IF;
      SET iterator = iterator + 1;
   END WHILE;   
   RETURN CONVERT(replace(output,',','.'), DECIMAL) ;
END $$

答案 3 :(得分:0)

此外,如果字符串包含多个数字,我会再次修改以仅提取一个数字。如果存在某些字符串pre-differenciate,则可以使用EXTRACT_NUMBER(SUBSTRING_INDEX(Notas,'CHARS', - 1))调用该函数作为前缀字符的CHARS

DELIMITER $$
DROP FUNCTION IF EXISTS `EXTRACT_NUMBER`$$

DELIMITER $$
CREATE FUNCTION EXTRACT_NUMBER(input VARCHAR(255))
   RETURNS VARCHAR(255)
BEGIN
   DECLARE output   VARCHAR(255) DEFAULT '';
   DECLARE iterator INT          DEFAULT 1;
   WHILE iterator < (LENGTH(input) + 1) DO
      IF SUBSTRING(input, iterator, 1) IN (',', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' ) THEN
        IF (SUBSTRING(input, iterator, 1) = ',' AND output = '') 
                THEN SET output = ''; 
            END IF;
         SET output = CONCAT(output, SUBSTRING(input, iterator, 1));
      END IF;
      IF (SUBSTRING(input, iterator, 1) NOT IN (',', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' ) AND output <> '') 
            THEN SET iterator = LENGTH(input);
      END IF;
      SET iterator = iterator + 1;
   END WHILE;
   RETURN replace(output,',','.');
END $$