sql - 从 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.
数据类型有什么问题?
解决方案
您可以使用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');
理想的解决方案是将价值存储为DECIMAL(10,4)
并忘记铸造。
推荐阅读
- c - 识别循环的时间复杂度
- jasperserver - 参数化报告上的 Jasperserver 内部服务器错误 500
- eslint - eslint 规则导入/在 commonjs 中命名的等价
- python - 如何绘制多维数组?
- mongodb - 如何使用 Go 驱动程序或 mgo/qmgo 在 MongoDB 中存储地理空间数据?
- php - 如何在添加到购物车消息中将 product_name 替换为 product_sku
- gradle - Gradle无法在intellij Idea中获取插件
- c# - UWP 组合框下拉菜单
- reactjs - 使用 react-cool-inview 时无法对未安装的组件执行 React 状态更新
- java - 如何在不使用 java.util.Arrays 的情况下对字符串进行不区分大小写的排序?