首页 > 解决方案 > 从 nvarchar 转换为十进制并按范围过滤

问题描述

我想对这些字符串值执行查询:

Record ID / Value
1 / 10.5
2 / 12
3 / 8
4 / 19.25
5 / 16.4
6 / 14

value 列是一个 nvarchar 列。我想过滤用户插入的两个字符串值之间的结果(例如 10 和 15)。我尝试使用:

SELECT Value 
FROM Table 
WHERE CONVERT(decimal(10, 2), Value) 
    BETWEEN CONVERT(decimal(10, 4), '10') 
    AND CONVERT(decimal(10, 4), '15')

但我有以下错误:

Error converting data type nvarchar to numeric.

数据类型有什么问题?

标签: sqlsql-servertsql

解决方案


您可以使用TRY_CONVERT(SQL Server 2012 和更高版本):

SELECT Value 
FROM Table 
WHERE TRY_CONVERT(decimal(10, 2),Value) BETWEEN TRY_CONVERT(decimal(10, 4), '10') 
                                            AND TRY_CONVERT(decimal(10, 4), '15')

更好的方法是添加计算列:

CREATE TABLE tab(
   value VARCHAR(100),
   value_as_decimal AS (TRY_CONVERT(decimal(10, 2),Value)) PERSISTED
);

CREATE INDEX tab_ix ON tab(value_as_decimal) INCLUDE(Value);

SELECT Value 
FROM Table 
WHERE value_as_decimal BETWEEN TRY_CONVERT(decimal(10, 4), '10') 
                           AND TRY_CONVERT(decimal(10, 4), '15');

DBFiddle 演示

理想的解决方案是将价值存储为DECIMAL(10,4)并忘记铸造。


推荐阅读