专栏首页SQL实现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 就是十位上的数,第三张表的数对应的是个位。

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 的编号 >>>

   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() 函数将会得到意想不到的结果,不信请看 >>>

SELECT LPAD('1000',3,'0')


lpad('1000',3,'0')  
--------------------
100          

本文分享自微信公众号 - SQL实现(gh_684ee9235a26),作者:zero

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-12-05

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 条形码生成软件如何连续生成不同的条形码

    很多使用条形码生成软件的朋友,都知道软件可以生成条形码,但是连续生成不同条码的话,就不知道该如何操作了。如果想要连续生成不同的条形码,可以在软件中用数据库导入和...

    用户5746110
  • Excel公式技巧33: 再谈生成连续的整数

    在《Excel公式技巧04: ROW与ROWS函数,生成连续的整数》中,我们主要讲解了如何让公式中有一部分能够在该公式向下复制到连续的行时,生成一系列连续的整数...

    fanjy
  • 效率提升16800倍的连续整数生成方法

    很多时候需要用到连续的id进行数据对比,如判断是否连续等问题。那么,生成连续整数的方式有多种,首先容易想到的是逐步循环,如果想生成1kw条记录,则需要循环1kw...

    July
  • Excel技巧:如何给不连续的产品进行批量编号?

    具体操作方法如下:假设我们要给下面的产品,计算机标注产品编号1、打印机为2、显示器为3、路由器为4。要求让其对应的产品编号填充置C列。

    砸漏
  • Excel公式技巧48: 生成从大到小连续的整数

    在编写公式时,经常要用到连续的整数,例如取单元格区域中的值、取文本数据中的连续字符,等等。通常,我们使用ROW函数来生成连续的整数,例如数组公式:

    fanjy
  • SQL进阶-10-SQL处理序列

    在关系型数据库的数据结构中,默认是不考虑数据的顺序。处理有序集合在SQL中不能直接实现,但是可以通过集合和谓词来间接实现处理有序数据的需求。

    皮大大
  • 存储时间戳连续日志的sql语句

    有这样一个需求,网络4G设备在运行时会上下线,会报错,当上下线或者报错时会将时间戳提交到管理系统,管理系统需要记录这些时间戳,那么该如何记录呢?

    挥刀北上
  • SQL练习笔记四:连续出现的数字

    用户6184845
  • 如何实现一个跨库连表SQL生成器?

    阿里妹导读:用户只需在前端简单配置下指标,系统即可自动生成大宽表,让用户查询到他所需要的实时数据,数据源支持跨库并支持多种目标介质。这样的数据全局实时可视化如何...

    用户6543014
  • Excel公式技巧04: ROW与ROWS函数,生成连续的整数

    有时候,我们希望公式中有一部分能够在该公式向下复制到连续的行时,生成一系列连续的整数。

    fanjy
  • DataGrid连接Access的快速分页法——动态生成SQL语句

    作者:黎波usingSystem;usingSystem.Text;namespacePagi...

    Java架构师必看
  • 卡成PPT不开心?GAN也能生成流畅的连续表情了 |ECCV Oral · 代码

    不过,从前的GAN只会生成一些互无关联的表情。这样,即便做成动图,也拥有浓厚的PPT风韵。

    量子位
  • DAO 设计模式

    客户发送数据到显示层,显示层发送数据到业务层,业务发送数据到数据层,数据层进行持久化.即.保存进入databases

    mySoul
  • 用SQL高性能解决字符串的连续匹配

    高性能解决有序集合的连续匹配问题 场景: A集合有8个元素:ali、boy、c、dog、e、f、g、h, B集合有5个元素:boy、c、dog、e、h 问B中...

    企鹅号小编
  • Leetcode-sql-four

    本文中主要是介绍LeetCode中关于SQL的练习题,从易到难,循序渐进。文中会介绍题目和提供尽可能多的解答方案。从本文开始属于\color{red}{中等}难...

    皮大大
  • Excel公式练习78: 判断并标识不连续的编码(续)

    本次的练习是:与《Excel公式练习77:判断并标识不连续的编码》相似,编码都是4个字符,由1个字母接着3个数字组成,但增加了字母没有按顺序的情形,如下图1所示...

    fanjy
  • 2019Java面试宝典数据库篇 -- MySQL

    SQL 语言不同于其他编程语言的最明显特征是处理代码的顺序。在大多数据库语言中,代码按编码顺序被处理。但在 SQL 语句中,第一个被处理的子句是 FROM,而不...

    浩Coding
  • 再见了,收费的 Navicat

    DBeaver 适用于开发人员,SQL程序员,数据库管理员和分析人员的免费多平台数据库工具。

    民工哥
  • JDBC为什么要使用PreparedStatement而不是Statement

    PreparedStatement是java.sql包下面的一个接口,用来执行SQL语句查询,通过调用connection.preparedStatement(...

    哲洛不闹

扫码关注云+社区

领取腾讯云代金券