mysql:将分数字符串转换为数字

时间:2012-10-23 14:39:33

标签: mysql

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

我想将它们转换成数字。 在第一种情况下,3/4 ==> 0.75。
在更复杂的第二种情况下,剥离像“km”和“degree”这样的单位 “1/2 km”==> 0.5。

3 个答案:

答案 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;
  }
}