sql - 生成连续的客户端编号

标签 sql sql-server azure-sql-database

我有一个基于客户端的系统,需要以下形式的连续客户端编号。

第一个客户将获得 A001,然后每个新客户将获得 A999。一旦到达A999,它将继续B001-B999,依此类推,直到Z001-Z999,此时它将重置为AA001-AA999,依此类推。

有人知道如何实现这一目标吗?

最佳答案

这将为您提供从 A001 到 ZZ999 的确切号码。如果您想要更多的数字,则需要为第三个字母添加逻辑,等等。请注意,每个字母不会获得 1000 个数字,这会让事情变得稍微有点尴尬。

WITH Numbers AS (
    SELECT 1 AS number
    UNION ALL
    SELECT number + 1 AS number FROM Numbers WHERE number < 701298)
SELECT 
    number,
    CASE WHEN number > 25974 THEN CHAR(64 + (number - 1) / 25974) ELSE '' END --This is the first letter (optional)
        + CHAR(65 + ((number - 1) / 999) % 26) --This is the second letter
        + FORMAT(CASE WHEN number < 1000 THEN number ELSE CASE WHEN number % 999 = 0 THEN 999 ELSE number % 999 END END, 'd3') --This is the three digit number
    AS client_id
FROM 
    Numbers 
OPTION (MAXRECURSION 0);

数字 CTE 只是为了获得合适数量的数字 (1 - 701,298)。一旦我有了它们,我需要找到第二个字母变化(每 999 个数字)或第一个字母变化(每 26 * 999 = 25974 个数字)时的边界。请注意,第一个字母在需要时会被隐藏。

这将为您提供 27 * 26 * 999 个客户端 ID(第一个字母可以是空白或 A-Z = 27 个选项,第二个字母可以是 A-Z = 26 个选项,数字可以是 001-999 = 999 个选项)。总共有 701,298 个客户端 ID。

我建议使用 IDENTITY 列或 SEQUENCE 来获取“内部”id(这将是主键候选),然后使用函数根据该数字计算客户端 ID。这对于多个用户来说更安全,等等。您可以使用计算列,但这是一个相当大的开销?

关于sql - 生成连续的客户端编号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48322221/

相关文章:

sql-server - 在 Azure SQL 数据库上设置 RESTRICTED_USER

sql-server - 我们如何在 SQL Server 中实现具有显着性值的 excel 天花板功能

azure-sql-database - 将数据从 Azure HUB-IOT 保存到 Azure SQL 数据库

azure - 与ntp时钟同步

c# - 如何同步两个不同数据库表中的不同列名?

sql - 不使用临时表从表中删除重复项

sql - 如何在 postgresql 选择查询中仅从 age() 函数中获取年份

mysql - 通过扩展字段更新MySql表的高效方法

sql - 加入两个具有 where 子句的选择查询

c# - where 子句中的多个列值