我有像......“3/4”和“5/9”这样的字符串,还有一些像......“1/2 km”和“3/4 degree”存储在mysql列中。
我想将它们转换为数字。在第一种情况下,3/4 ==> .75。
在更复杂的第二种情况下,去掉像“km”和“degree”这样的单位,所以“1/2 km”==> 0.5。
我有像......“3/4”和“5/9”这样的字符串,还有一些像......“1/2 km”和“3/4 degree”存储在mysql列中。
我想将它们转换为数字。在第一种情况下,3/4 ==> .75。
在更复杂的第二种情况下,去掉像“km”和“degree”这样的单位,所以“1/2 km”==> 0.5。
我认为这不是您应该在查询中执行的操作,而是在存储时计算它并将计算值保存在其文本值旁边的表中。
但是如果你愿意,你可以使用一些字符串函数来分割值并自己做数学:
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”,它可能会失败,如果它包含“这里没有数据”,它也可能会失败。
以上对我来说不太有效,所以想出了这个。该查询适用于“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;
使用 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;
}
}