【发布时间】:2016-05-10 20:49:43
【问题描述】:
我正在尝试从列中获取最大 Decimal 值,然后将 1 添加到它以获得下一个值。但是,该列的值是 varchar 类型,这意味着我必须过滤以确保它只尝试转换它可以转换的值,例如“123”,同时避免使用像“123a”这样的值
到目前为止我尝试的是这样的:
SELECT
(CAST(MAX(Id) AS DECIMAL(38,0)) + 1) AS 'New ID'
FROM database
WHERE Id NOT LIKE '%[^0-9]%' --filters out non-numeric ID values
AND (LEN(Id) + 1) < 39 --ensures ID is less than length 39
但是,当我运行这个时,如果 ID 列中存在 9 和 100 等值,则 MAX 会优先考虑 9 而不是 100。
我也尝试过:
SELECT
(CAST(MAX(CAST(Id AS DECIMAL(38,0))) AS DECIMAL(38,0)) + 1) AS 'New ID'
FROM database
WHERE Id NOT LIKE '%[^0-9]%'
AND (LEN(Id) + 1) < 39
但是,这会导致将 varchar 转换为数字时出错,因为我假设它会在过滤 WHERE 子句中的非数字 ID 之前尝试将其转换为小数。我也试过在开始时去掉多余的演员,但这仍然有同样的问题。
感谢您的帮助!
【问题讨论】:
-
切换顺序,使转换发生在最大值之前。
MAX(CAST(Id AS DECIMAL(38,0)) + 1) AS 'New ID'或类似的东西.. 或使用 CTE 首先消除非数字 ID,然后强制转换以获得最大 + 1
标签: sql sql-server sql-server-2012