Sql server 2008 Sql转换字符串值

Sql server 2008 Sql转换字符串值,sql-server-2008,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中转换这种值?不漂亮,但很有效 SELECT CAST(CASE WHEN CHARINDEX('/', val) > 0 THE

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

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

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

不漂亮,但很有效

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

不漂亮,但很管用

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

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

说到这里,您可以使用动态SQL做一些事情(假设您的输入始终采用您所显示的格式):


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

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

说到这里,您可以使用动态SQL做一些事情(假设您的输入始终采用您所显示的格式):


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

您使用的是哪种数据库管理系统?神谕PostgreSQL?DB2?我只是好奇做这件事的动机是什么……还有sql。你可以在sql上做一个函数,如果数字是可计算的,就计算它们。转换然后对结果排序为什么你不能有一个映射表,在其中存储所有的1/2=05和1/4=0.25等,然后在你找到的表中用这些值替换这些字符串如1/2、1/4等,您使用的是哪种DBMS?神谕PostgreSQL?DB2?我只是好奇做这件事的动机是什么……还有sql。你可以在sql上做一个函数,如果数字是可计算的,就计算它们。转换然后对结果排序为什么你不能有一个映射表,在其中存储所有的1/2=05和1/4=0.25等,然后在你找到的表中用这些值替换这些字符串类似于1/2、1/4等