我们经常会遇到这样一个问题,当从数据库查询出相应的数据后,没有唯一序号列,但有些前端框架会要求返回有唯一序号,无论这一列的序号是有序的还是无序的,只要保证唯一就可以。
那我知道的有下面几种办法:
1. 使用 数据库自带的序号函数
不同数据库的序号函数不一样,postgresql 是 ROW_NUMBER() OVER ()。
特点是 自增有序
SELECT
ROW_NUMBER() OVER () AS id,
material_no
FROM
"public"."workorder"
WHERE
material_no LIKE '%151%'
LIMIT 10;
结果如下:
id material_no
1 1511508C00
2 1511510A00
3 1511518A00
4 1511538A00
5 1512447A00
6 1514503A00
7 1514586A00
8 151A52ZC04
当然 row_number() over() 功能非常强大哦,有兴趣的可以看看 ROW_NUMBER() OVER()函数用法;(分组,排序),partition by
2. 使用 SQL语句实现
这是根网上的办法实现的,真的很巧妙,直接上SQL。但生成序号列是 无序的
SELECT
( SELECT COUNT (id) FROM "public"."workorder" AS A WHERE A . ID <= B."id" ) AS id,
material_no
FROM
"public"."workorder" AS B
WHERE
material_no LIKE '%151%'
LIMIT 10;
结果如下:
id material_no
1 1551510C32
8 1511508C00
66 1514503A00
71 1511538A00
34 1512447A00
37 151A52ZC04
44 1511518A00
57 1511510A00
63 1514586A00
3 1551510C32
思路其实很简单, 将结果集中能确定一行数据唯一性的某列或多列组合成标识符,再把结果集中小于等于标识符的记录数合计成一列,从而满足需求。
3. 使用 临时表 (摘自)
SQL的IDENTITY函数可以提供自增的序号,但只能用在带有INTO table子句的SELECT语句中,所以如果可以使用临时表的情况下可以使用这种实现方法。和第一种方法一样,这种实现方法对我也不适用,因为现在的项目规定不能使用临时表。
eg:
SELECT IDENTITY(INT,1,1) as seq,field1,field2,...,fieldn INTO tmpTableName FROM srcTableName;
SELECT * FROM tmpTableName;
DROP TABLE tmpTableName;