SQL将varchar 2/3转换为0.6(小数到十进制)

时间:2015-06-17 22:36:25

标签: mysql sql sql-server-2008-r2

我在列中保存了字符串 23.42 / 3 .............
我必须提取2/3并将其转换为0.6
将varchar值2/3转换为0.6是一个问题,提取不是问题。 2/3不是固定数字,它可以是我必须将其转换为十进制的任何分数

1 个答案:

答案 0 :(得分:1)

对于MySQL,假设字符串值中只有一个斜杠字符,您可以在此查询中使用类似于res别名的表达式:

SELECT t.str
     , RIGHT(SUBSTRING_INDEX(t.str,'/',1),1)+0 AS num
     , LEFT(SUBSTRING_INDEX(t.str,'/',-1),1)+0 AS den

     , (RIGHT(SUBSTRING_INDEX(t.str,'/',1),1)+0)
         /  (LEFT(SUBSTRING_INDEX(t.str,'/',-1),1)+0) AS res

  FROM ( SELECT '1234.62/4' AS str
         UNION ALL SELECT '1/4'
         UNION ALL SELECT '11/16'
         UNION ALL SELECT '/5'
         UNION ALL SELECT 'foo/5'
         UNION ALL SELECT 'fee3/4fi5/6'
         UNION ALL SELECT 'bar/'
         UNION ALL SELECT '/'
         UNION ALL SELECT ''
       ) t

返回:

  str             num     den       res  
  -----------  ------  ------  --------
  1234.62/4         2       4       0.5
  1/4               1       4      0.25
  11/16             1       1         1
  /5                0       5         0
  foo/5             0       5         0
  fee3/4fi5/6       3       6       0.5
  bar/              0       0    (NULL)
  /                 0       0    (NULL)
                    0       0    (NULL)

res的表达式只是num(分子)的表达式除以den(分母)的表达式。这些额外的列将作为这些工作方式的演示返回。做分工很简单。

如果您需要验证最多只有一个斜杠,在评估表达式以计算分数中的十进制值之前,您可以使用这样的表达式...

  SELECT IF(CHAR_LENGTH(t.str)-CHAR_LENGTH(REPLACE(t.str,'/',''))=1, expr, 0) 

只需将expr替换为您在上述查询中用于res的表达式。