当其数据类型为varchar时,无法在主键中正确递增

时间:2019-02-13 09:29:35

标签: sql sql-server-2014

我想生成一个主键,例如“ A-1”,“ A-2”,“ A-3” ...直到“ A-1000”。该列的数据类型为varchar(7),表名称为sesson。我使用了像max(substring(id,3,4))之类的子字符串查询,因为max_id.increament是在前端代码中完成的。我的查询从“ A-1”到“ A-10”正常工作。当“ A-10”保存在数据库中时,它将显示“ 9”作为max_id,但应显示“ 10”作为max_id。为此需要进行哪些更改?

select max(substring(id,3,4)) as max_id from sesson

保存“ A-10”后,应将“ 10”显示为max_id,但应将“ 9”显示为max_id。

2 个答案:

答案 0 :(得分:1)

在max函数之前使用to_number,如下所示。

select max(to_number(substr(id,3,4))) as max_id from sesson

默认情况下,系统会将子字符串的结果视为字符串..因此,最大值将基于ascii值..一个字符一个字符地计算。因此,9的ascii值将高于10(由于系统将逐字符比较,因此9将与1比较)

答案 1 :(得分:0)

将值转换为数字。在SQL Server中,您可以执行以下操作:

select max(try_convert(int, substring(id, 3, 4))) as max_id
from sesson