我有像“3/4”和“5/9”这样的字符串,有些像......“1/2 km”和“3/4度”存储在mysql列中。
我想将它们转换成数字。
在第一种情况下,3/4 ==> 0.75。
在更复杂的第二种情况下,剥离像“km”和“degree”这样的单位
“1/2 km”==> 0.5。
答案 0 :(得分:1)
我认为这不是你应该在查询中做的事情,而是在存储时计算它并将计算值保存在其文本值旁边的表中。
但是如果你愿意,你可以使用一些字符串函数来分割值并自己做数学运算:
select
x.Multiplier / x.Divider as Result
from
(select
cast( substr( t.String,
1,
locate('/', t.String) - 1)
as decimal)
as Multiplier,
cast( substr( t.String,
locate('/', t.String) + 1,
locate( ' ',
concat(t.String, ' ')))
as decimal)
as Divider
from
YourTable t) x
但请注意,如果数据“无效”,这可能会造成麻烦。如果它显示'0/0 km',它可能会失败,如果它包含'此处没有数据',它也可能会失败。
答案 1 :(得分:0)
以上对我来说并不是很有用,所以想出了这个。该查询适用于' 10'' 3/4'和' 10 3/4'。显然,您应该使用字符串或表中的选定值替换底部构造的行:
SELECT
IF (
LOCATE(' ',fraction) > 0 OR LOCATE('/',fraction) = 0,
SUBSTRING_INDEX(SUBSTRING_INDEX(fraction,'/','1'),' ','1')
,0
) AS `integer`,
IF (
LOCATE('/',fraction) > 0,
SUBSTRING_INDEX(SUBSTRING_INDEX(fraction,'/','1'),' ','-1'),
0
) AS numerator,
SUBSTRING_INDEX(fraction,'/','-1') AS denominator,
(SELECT `integer`) + ((SELECT numerator) / (SELECT denominator)) AS `decimal`
FROM (
SELECT '10 3/4' AS fraction
UNION SELECT '10'
UNION SELECT '3/4'
) t;
答案 2 :(得分:-1)
使用PHP,您可以:
// assuming $vals has the values from the database
$converted = array();
foreach ($vals as $key => $val) {
preg_match("/^(\\d+)\\/(\\d+)/", $val, $matches)
if (count($matches) > 2) {
$numerator = (int) $matches[1];
$denominator = (int) $matches[2];
$converted[$key] = (float) $numerator / $denominator;
}
}