1

我有像......“3/4”和“5/9”这样的字符串,还有一些像......“1/2 km”和“3/4 degree”存储在mysql列中。

我想将它们转换为数字。在第一种情况下,3/4 ==> .75。
在更复杂的第二种情况下,去掉像“km”和“degree”这样的单位,所以“1/2 km”==> 0.5。

4

3 回答 3

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”,它可能会失败,如果它包含“这里没有数据”,它也可能会失败。

于 2012-10-23T14:48:37.373 回答
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;
于 2016-04-27T21:26:04.320 回答
-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;
  }
}
于 2012-10-23T14:47:52.103 回答