从nvarchar转换为十进制并按范围过滤

时间:2018-06-14 08:55:26

标签: sql sql-server tsql

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

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.

数据类型有什么问题?

1 个答案:

答案 0 :(得分:0)

您可以使用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 Demo

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