在PostgreSQL中向左填充零


103

我对PostgreSQL相对较新,并且我知道如何在SQL Server中在左边用零填充数字,但是我很难在PostgreSQL中弄清楚这一点。

我有一个数字列,其中最大位数为3,最小位数为1:如果是一位,它的左边有两个零,如果是两位,则有1,例如001、058、123。

在SQL Server中,可以使用以下命令:

RIGHT('000' + cast([Column1] as varchar(3)), 3) as [Column2]

在PostgreSQL中不存在。任何帮助,将不胜感激。


2
使用Google 正是我找到此页面的方式。这是我排名第一的Google结果。
杰森


说到SQL Server,它们具有format()功能,可以让您使用format(Column1,'000') as Column2
曼戈

Answers:


179

您可以使用rpadlpad功能分别在右侧或左侧填充数字。请注意,这不适用于数字,因此您必须使用::char::text强制转换它们:

SELECT RPAD(numcol::text, 3, '0'), -- Zero-pads to the right up to the length of 3
       LPAD(numcol::text, 3, '0'), -- Zero-pads to the left up to the length of 3
FROM   my_table

2
@EvanCarroll这是正确的答案-您在说什么?
Yarin

@Yarin 这个答案是带有格式字符串的标准化的一个函数调用方法。使用RPAD / LPAD,您将转换为字符串,然后处理字符串。使用to_char,您只是指定一种不同的字符串化方法。
埃文·卡罗尔

3
@EvanCarroll两者都很有用-这一个让您指定字符串长度的数字-另一个需要知道'fm'代表填充模式,并允许您指定格式图片
Brian Burns

警告:与经典printf功能不同,这些骨头功能会在不适合的情况下将您的字符串默默地切成小段。因此,您可能需要一个case when length(foo) ...环绕它。
山姆·沃特金斯

62

to_char()函数可以格式化数字:

select to_char(column_1, 'fm000') as column_2
from some_table;

fm前缀(“填充模式”)避免了产生VARCHAR前导空格。在000简单地定义你想拥有的位数。

psql(9.3.5)
键入“帮助”以获取帮助。

postgres =>,其中sample_numbers(nr)为(
postgres(>值(1),(11),(100)
postgres(>)
postgres->选择to_char(nr,'fm000')
postgres->来自sample_numbers;
 to_char
---------
 001
 011
 100
(3列)

postgres =>

有关格式图片的更多详细信息,请参见手册:http :
//www.postgresql.org/docs/current/static/functions-formatting.html


2
如果数字太长,to_char请将其转换为###。Oo
Sam Watkins

我很好奇是否有解决方案,如果#如果长度超过to_Char中指定的时间,它将转换为###。到底有没有具体到最小的零,然后有更大的数字呢?例如,如果您为lpad指定3,则数字的格式应为001 010 100 .. 1001
mike hennessy

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.