如何从varchar中隔离小数? 防爆。我如何得到' 97.4'来自' 97.4N IU / ML'?
答案 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
旧答案
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
测试(旧答案)