SQL:从varchar中提取小数

时间:2017-04-06 23:32:21

标签: sql reporting-services ssms

如何从varchar中隔离小数? 防爆。我如何得到' 97.4'来自' 97.4N IU / ML'?

1 个答案:

答案 0 :(得分:2)

假设数字部分始终位于左侧,您可以

更新

在我的解决方案仅提取字符串的小数部分之前,它没有进行转换。此外,如果您收到的数据不好,则无法保证您在该列中获得的内容,您可能也可以获得科学表达式,因此最好在尝试提取数字之前进行ISNUMERIC()测试。使用Float类型从字符串转换很好,因为它也会处理科学表达式,但将数字存储为浮点数绝不是一个好主意,因为显示为2.70的浮点数可能不等于另一个显示为2.70的浮点数,因为在每个实例中系统决定将它存储在更多的精度位置,因此如果您计划对值进行任何比较或数学运算,则应始终以固定的精度格式存储数字。

CREATE TABLE MyTable(MyColumn VARCHAR(25))
GO

INSERT INTO MyTable(MyColumn)
VALUES
 ('1.23E+10')
,('2.23E+8')
,('2.235432E-6')
,('4 of 40')
,('500mg/day')
,('97.4N IU/ML')
,('No Maximun')
,(NULL)
,('')
,('See Appendix R')
GO

SELECT
  CONVERT(DECIMAL(20,8),
  CASE 
    WHEN IsNumeric(MyColumn)=1 THEN 
      CONVERT(FLOAT,MyColumn)
    ELSE CONVERT(FLOAT,'0'+LEFT(MyColumn,PATINDEX('%[^0-9.]%',MyColumn)-1))
  END) AS MyDecimal
  ,MyColumn
FROM MyTable

New SQL Fiddle

旧答案

SELECT LEFT('97.4N IU/ML',PATINDEX('%[^0-9.]%', '97.4N IU/ML')-1)

所以在列上执行它看起来像这样

SELECT LEFT(MyColumn,PATINDEX('%[^0-9.]%', MyColumn)-1) FROM MyTable

您可以使用此SQL Fiddle

测试(旧答案)