我使用的是SQL Server 2005,并且有一个包含序列号的列,nvarchar(50)
。
我的问题是从表中选择max(serial_no)
。序列号的长度只有7,但新的序列号现在为15.每当我选择max时,我得到一个长度为7的结果,这意味着数据是旧的。我也无法过滤它只能从长度为15的记录中进行选择,因为那时我会错过我查询的其他一些数据。
旧的序列号看起来像这样......
'SNGD001'
......,新的看起来像这样:
'SN14ABCD0000001'
编辑:我尝试创建一个没有旧序列号(5个字符长)的虚拟表,并且我得到了正确的结果。
答案 0 :(得分:1)
正如已经提到的,你的问题有点难以理解。如果最大值可能是您的旧序列号之一或新的序列号之一,我相信以下应该可以解决问题:
SELECT MAX(RIGHT('0000000' + REVERSE(LEFT(REVERSE(YourTextColumn), PATINDEX('%[a-z]%', REVERSE(YourTextColumn)) - 1)), 7))
FROM YourTable
它从右侧找到第一个非数字字符,将所有内容保持在右侧。然后,它将生成的数字字符串零填充到7个字符并应用MAX
函数。
答案 1 :(得分:0)
如果没有良好的样本数据来解决问题,您的问题有点难以理解。我建议将来,你会展示一些数据的例子,以获得更好的背景,尤其是测序。现在,您需要从表中获取“serial_no”的MAX(),这样您就可以检测下一个要分配的序列号。但是,您的序列号似乎是前缀字符串的串联,然后是顺序。所以,如果我要查看你的简短数据,那就是(最后3位是顺序序列化)
SNGD001
SNGD002
SNGD003
...
SNGD389, etc...
和您的新数据与最后一个(最后7位是连续序列化)
SN14ABCD0000001
SN14ABCD0000002
SN14ABCD0000003
...
SN14ABCD0002837
如果这是正确的,那么你基本上需要根据转换后缀数字序列的字符串PLUS的前3或8个字符来查看max。对于初学者,让我们一起来看看我们是否在正确的轨道上,然后您可以轻松地将前缀和序列号连接在一起,以确定下一个可用的号码。
因此,根据上述示例,您可能想知道每个前缀的最后一个数字
SNGD389 and
SN14ABCD0002837 respective per their prefix
如果以上是正确的,我可以从...开始......
select
case when LEN( RTRIM( yt.serial_no )) = 7
then LEFT( yt.serial_no, 4 )
else LEFT( yt.serial_no, 8 ) end as SerialPrefix,
MAX( case when LEN( RTRIM( yt.serial_no )) = 7
then CONVERT(INT, RIGHT( yt.serial_no, 3 ))
else CONVERT(INT, RIGHT( yt.serial_no, 7 )) end ) as SerialSequence
from
YourTable yt
group by
case when LEN( RTRIM( yt.serial_no )) = 7
then LEFT( yt.serial_no, 4 )
else LEFT( yt.serial_no, 8 ) end as SerialPrefix
哪会导致(根据我提供的样本数据)
SerialPrefix SerialSequence
SNGD 389
SN14ABCD 0002837
其中由于串行序列列是数字的,你可以加1,然后left-zero填充一个字符串并将两者连接在一起以便创建
SNGD390
SN14ABCD0002838