我想将字符串值转换为浮动,例如
User entered value Expected Result
1/2 0.5
1 1
1/4 0.25
1 1/2 1.5
如何在sql server中转换这种值?
答案 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非常相似。