Sql转换字符串值

时间:2012-10-05 11:01:36

标签: sql-server-2008

我想将字符串值转换为浮动,例如

User entered value      Expected Result
1/2                     0.5
1                       1
1/4                     0.25
1 1/2                   1.5

如何在sql server中转换这种值?

2 个答案:

答案 0 :(得分:0)

不漂亮,但有效

SELECT CAST(CASE WHEN CHARINDEX('/', val) > 0 THEN SUBSTRING(val, 0, CHARINDEX('/', val)) 
                 ELSE val END AS float) /
       CAST(CASE WHEN CHARINDEX('/', val) > 0 THEN SUBSTRING(val, CHARINDEX('/', val) + 1, CHARINDEX('/', REVERSE(val)))
                 ELSE 1 END AS float)
FROM dbo.test12
WHERE CHARINDEX(' ', val) = 0
UNION ALL
SELECT CAST(SUBSTRING(val, 0, CHARINDEX(' ', val)) AS float) +
       CAST(SUBSTRING(val, CHARINDEX(' ', val), CHARINDEX('/', val) - CHARINDEX(' ', val)) AS float) /
       CAST(SUBSTRING(val, CHARINDEX('/', val) + 1, CHARINDEX('/', REVERSE(val))) AS float)
FROM dbo.test12
WHERE CHARINDEX(' ', val) > 0

答案 1 :(得分:-1)

这种事情最好在您的GUI中完成:在将表达式放入数据库之前评估表达式,而不是之后。如果您想保留原始用户输入,您也可以随时插入GUI。评估随机用户输入在任何系统中都是危险的,因此最好解析和/或评估数据库外部的输入,既限制潜在影响,又使用更强大(或更不专业,如果您愿意)编程语言比TSQL。

说了这么多,你可以用动态SQL做一些事情(假设你的输入总是采用你所显示的格式):

declare @input varchar(10)
set @input = '1 1/2'
set @input = replace(@input, ' ', '+')
exec('select cast(' + @input + '.0 as float)')

但是这有所有问题of dynamic SQL,包括信任用户输入。并且您不能在TSQL函数中使用动态SQL,因此无法方便地将其包装起来以便在查询中使用。当然,您可以在TSQL过程中使用游标或编写CLR函数或存储过程,但这种任务在数据库中感觉不合适。顺便说一句,this question非常相似。