【问题标题】:How to sum + 1 to a Varchar value that has a numeric part in it efficiently?如何有效地将 + 1 与具有数字部分的 Varchar 值相加?
【发布时间】:2020-03-16 15:45:48
【问题描述】:

我有一个Varchar(9) 列,它有一个代码来识别特定情况,它与主键 ID 不同,因为这个是经过一些验证后创建的,而且代码不是按顺序创建的,我们可以有一个案例昨天在 6 点创建,另一个在 8 点创建,另一个在 8 点创建的代码将比另一个先创建。好吧,问题是每个代码都应该是最后一个代码+1,这并不难,但是因为它包含非数字值,所以我们必须检索最大值,但效率不高。

例如:

ID     Code
1      AA0008-BX
2      AA0010-BX
3      AA0011-BX
4      AA0009-BX

所以在这种情况下,我必须遍历这 4 个值,检索 'AA0011-BX' 作为最大值,在数字部分添加 1 以使其成为 'AA0012-BX',另外,我有添加使其成为数字字符所需的零的数量。因为它最后有 AA 和 -BX 部分,我们可以使用 max(Code) 并检索最大的,但这是一个包含数千条记录的表并且速度很慢,我想知道什么是最好的选择。

您将如何使用代码来实现这一点以使其真正快速? TIA

【问题讨论】:

  • 对每种类型的代码使用一个序列
  • 我们必须检索最大值,但它不是很有效”并且很可能也不正确,除非您在该操作期间完全阻止对表的写入跨度>
  • 强制性架构相关评论:如果这可能再次发生,您可能需要重新考虑架构,并将 Code 的组件存储在单独的列中,Code 作为计算列基于零件的值。
  • @a_horse_with_no_name 我们使用 Microsoft SQL Server,我知道如果两个人同时使用它或者如果有人也在添加新记录,那么总是检索最大数量的麻烦,如果可以的话帮助,这会很棒,我们有一些限制它的方法,但不是在数据库本身。
  • 格式是否总是 2 个字母、4 个数字、一个破折号,然后是 2 个字母?

标签: sql sql-server azure


【解决方案1】:

假设格式始终是 2 个字母、4 个数字、一个破折号,然后是 2 个字母,正如问题下的 cmets 中所指定的那样,您可以像这样简单地使用 substring 函数:

declare @next int
select @next = max(cast(substring(code,3,4) as int))+1 from table1
insert into table1 values ('AA'+right('0000'+cast(@next as varchar(4)),4)+'-BX')

【讨论】:

  • @DavidBuck 怎么样?
【解决方案2】:

如果您使用的是 SQL Server 2017 或更高版本,则可以使用TRIM 来实现所需的结果。

尝试以下方法:

declare @tab table (ID int, val varchar(10))

insert into @tab select 1, 'AA0008-BX'
insert into @tab select 2, 'BA0010-BX'
insert into @tab select 3, 'XA0011-BX'
insert into @tab select 4, 'AY0009-BX'

select TOP 1 REPLACE(VAL, TRY_CONVERT(INT, TRIM('ABCDEFGHIJKLMNOPQRSTUVWXYZ-' FROM VAL)), TRY_CONVERT(INT, TRIM('ABCDEFGHIJKLMNOPQRSTUVWXYZ-' FROM VAL))+1 )
from @tab
ORDER BY TRY_CONVERT(INT, TRIM('ABCDEFGHIJKLMNOPQRSTUVWXYZ-' FROM VAL)) DESC

【讨论】:

    猜你喜欢
    • 2015-09-22
    • 2010-09-26
    • 1970-01-01
    • 2016-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多