1

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

身份证尺寸
1 100毫升
2 30毫升
3 6.7克
4 8.8公斤
5 阿尔法 110v
6 贝塔 220v

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

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

id 大小 finalSize
3 6,7克 6,7
4 8,8公斤 8,8
2 30毫升 30
1 100毫升 100
5 阿尔法 110v 110
6 贝塔 220v 220

和这个?(只是身份证):

ID
3
4
2
1
5
6

PS:我需要用 MySQL 函数来做这个......

PS:2我尝试使用MySQL搜索匹配正则表达式,但看起来没有函数可以返回匹配的模式。也许如果我创建一个函数来替换不是数字的任何东西,或者,可以解决我的问题,但我找不到这样做的方法。MYSQL REPLACE 函数不使用正则表达式。

4

4 回答 4

4

这是一个基于函数的解决方案:该函数在其中一篇文章中很容易获得。所以我只更改了将 a 添加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_replacelike Oracle。除非您想使用多个replaces(不想假设有多少),否则功能会为您派上用场。

于 2013-01-18T17:08:10.763 回答
1

尝试这个

     SELECT size,
     @num := CONVERT(size, SIGNED) AS num_part,
     SUBSTRING(size, LENGTH(@num) + 1) AS rest_of_string 
     FROM your_table;
于 2013-01-18T16:51:25.680 回答
0

另外,如果字符串包含多个数字,我再次修改为仅提取一个数字。如果存在一些字符或字符串预区分,您可以调用函数,其中 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 $$
于 2015-10-28T11:58:03.887 回答
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 $$
于 2015-10-28T10:03:04.980 回答