我使用Postgresql 11,我有一个字符串列,它是固定的8长度数字号码。这个值应该是序列00000001
,00000002
等等。我知道Postgresql支持SEQUENCE
列,但是如何使它成为一个固定长度的字符串?
一种解决方案是使用两种SQL,一种是使用序列列(即整数)对行进行insert
,另一种是根据序列列值更新行,使其成为例如00000001
。
我也来交叉LPAD函数,但不确定它是否适用于这种情况。
发布于 2021-04-06 06:16:13
只需创建一个标准序列,然后使用lpad
来填充所需的零:
CREATE SEQUENCE seq1;
SELECT lpad(nextval('seq1')::text,8,'0');
lpad
----------
00000001
编辑:正如@a_horse_with_no_name的评论中所提到的,to_char()
是一个很好的替代方案
SELECT to_char(nextval('seq1'), 'FM00000000');
to_char
----------
00000001
演示:db<>fiddle
发布于 2021-04-06 06:45:11
我不会用这种方式储存号码的。创建标识列,并在显示值时使用to_char()
或lpad()
。如果您非常需要这一点,您可以创建一个视图,以避免一直编写表达式:
create table the_table
(
id integer generated always as identity (maxvalue 99999999),
... other columns
);
create view the_table_with_formatted_id
as
select lpad(id::text, 8, '0') as formatted_id,
... other columns
from the_table;
另一个选项是在text
列的默认值中使用序列:
create sequence the_table_id_seq;
create table t
(
id text default lpad(nextval('the_table_id_seq')::text, 8, '0'),
... other columns ...
);
与identity
列不同,上面的内容并不阻止插入绕过序列并将abcdefgh
存储到该列中。如果您想确保它是一个严格的数值(但格式化的)值,那么使用标识列是一个更好的选择。
https://stackoverflow.com/questions/66962960
复制相似问题