给大家一分钟,请思考:在你熟悉的数据库里使用 SQL 快速生成 001~999 的编号有哪些方法。
以下是我想到的在 MySQL 中可以实现的方法。
我把这个实现过程分成两部分:
-
生成 1~999 的序号;
-
对不足三位数的序号在前面补‘0’。
MySQL 提供了 LPAD()
左填充函数,因此第二部分已经解决。
生成 1~999 的序号的方法有:
-
找到任意一张记录数大于 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
。 -
使用递归,关于用递归生成连续序号的文章请看——生成数字序列;
-
手动生成 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 是填充的字符/字符串。文章来源:https://www.toymoban.com/news/detail-651387.html
如果给定的 str 超出了 len 的长度,使用 LPAD()
函数将会得到意想不到的结果,不信请看 >>>文章来源地址https://www.toymoban.com/news/detail-651387.html
SELECT LPAD('1000',3,'0')
lpad('1000',3,'0')
--------------------
100
到了这里,关于SQL 生成连续的编号的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!