2

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

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

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

4

2 回答 2

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
于 2012-10-05T12:38:20.753 回答
-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)')

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

于 2012-10-05T20:50:59.760 回答