前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >SQL 生成连续的编号

SQL 生成连续的编号

作者头像
白日梦想家
发布2020-12-14 10:03:49
3.7K0
发布2020-12-14 10:03:49
举报
文章被收录于专栏:SQL实现SQL实现

给大家一分钟,请思考:在你熟悉的数据库里使用 SQL 快速生成 001~999 的编号有哪些方法。

以下是我想到的在 MySQL 中可以实现的方法。

我把这个实现过程分成两部分:

  1. 生成 1~999 的序号;
  2. 对不足三位数的序号在前面补‘0’。

MySQL 提供了 LPAD() 左填充函数,因此第二部分已经解决。

生成 1~999 的序号的方法有:

  1. 找到任意一张记录数大于 1000 的表 t,执行 SELECT ROW_NUMBER() OVER() AS num FROM t LIMIT 999 就能够生成 1~999 的序号;如果数据库不支持窗口函数,还可以用用户变量,SELECT @rn:=@rn + 1 AS num FROM t,(SELECT @rn:=0) AS tmp LIMIT 999
  2. 使用递归,关于用递归生成连续序号的文章请看——生成数字序列
  3. 手动生成 0-9 的数字,将这批数字放到临时表中,对临时表重复求笛卡尔积,具体实现后面有讲。

假设 t10 存储了 0-9 的数字,t10 和 t10 做笛卡尔积操作就会产生 100 条记录,再将这 100 条记录的结果集和 t10 执行笛卡尔积操作,就得到 1000 条记录的结果集。

因此,将三张 t10 的数据表执行笛卡尔积操作,第一张表的数乘以 100 得到的是百位上的数,第二张表的数乘以 10 就是十位上的数,第三张表的数对应的是个位。

代码语言:javascript
复制
WITH t10 AS 
(SELECT 0 AS num 
UNION
SELECT 1 
UNION
SELECT 2 
UNION
SELECT 3 
UNION
SELECT 4 
UNION
SELECT 5 
UNION
SELECT 6 
UNION
SELECT 7 
UNION
SELECT 8 
UNION
SELECT 9) 
SELECT 
  num,
  LPAD(num, 3, '0') AS seq 
FROM
  (SELECT 
    a.num * 100 + b.num * 10 + c.num AS num 
  FROM
    t10 a,
    t10 b,
    t10 c) t 
WHERE num > 0 
ORDER BY 1 

1~999 的编号 >>>

代码语言:javascript
复制
   num  seq     
------  --------
     1  001     
     2  002     
     3  003     
     4  004 
     ...
    99  099     
   100  100     
     ...     
   998  998     
   999  999    

注意,lpad(str,len,padstr) 函数有三个参数,第一个参数 str 是要处理的原字符串,第二个参数 len 表示 str 最终的长度,第三个参数 padstr 是填充的字符/字符串。

如果给定的 str 超出了 len 的长度,使用 LPAD() 函数将会得到意想不到的结果,不信请看 >>>

代码语言:javascript
复制
SELECT LPAD('1000',3,'0')


lpad('1000',3,'0')  
--------------------
100          
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-12-05,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 SQL实现 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
云数据库 SQL Server
腾讯云数据库 SQL Server (TencentDB for SQL Server)是业界最常用的商用数据库之一,对基于 Windows 架构的应用程序具有完美的支持。TencentDB for SQL Server 拥有微软正版授权,可持续为用户提供最新的功能,避免未授权使用软件的风险。具有即开即用、稳定可靠、安全运行、弹性扩缩等特点。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档