如果我有类似于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函数不使用正则表达式。
答案 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 $$