Postresql选择前三个数字,包括零

时间:2018-08-23 15:48:02

标签: sql postgresql

我没想到这是个问题,但是我正在努力返回前3个数字,包括它们前面的0。在下面的示例中,我将展示一些我尝试过的东西。我希望它返回“ 001”。它返回“ 118”或错误。似乎每个解决方案都希望将其转换为文本,从而将其删除0。

'

返回118

'

错误:函数lpad(整数,整数,未知)不存在

SELECT lpad(00118458582::text, 3, '0')

返回118

SELECT lpad(00118458582, 3, '0')

错误:左功能(整数,整数)不存在

SELECT left(00118458582::text, 3)

返回118

请问能给我任何帮助吗?谢谢!

3 个答案:

答案 0 :(得分:3)

您的问题开始于尝试获取前3位数字之前,即您正在考虑00118458582是有效的INTEGER(或任何数字类型)。我的意思是,它不是无效,但是运行SELECT 00118458582::INTEGER时会发生什么?您得到118458582。因为这些类型中的前导零是没有意义的。因此,您永远不会在表中出现示例中的情况(在查询窗口中的硬编码数字前带有零),因为这些零不会存储在基于数字的数据类型字段中。

因此,遇到这种情况的唯一方法是当它们基于字符串时:SELECT '00118458582'::TEXT返回00118458582。然后,您可以运行自己的首选函数来获取前3个字符,例如SELECT LEFT('00118458582', 3)返回001。但是,如果您打算将其强制转换为INTEGER或其他内容,请不要忘记前导零。

答案 1 :(得分:1)

SELECT子字符串(00118458582 :: text,1,3) 返回118,因为它是一个数字118458582(前导零被自动删除),该数字被转换为文本'118458582',然后采用前3个字符。

如果您尝试使用前三位数字,然后然后转换为数字,则可以使用try:

选择子字符串('00118458582',1,3 ::数字)

它实际上可能是:

选择子字符串('00118458582',1,3)::数字

我现在还没有测试的方法...

答案 2 :(得分:0)

lpad()是指返回值的总长度。所以我想你想要

select lpad(00118458582::text, 12, '0'::text)

如果您始终想要精确的3个零,则只需将它们串联:

select '000' || 00118458582::text