我没想到这是个问题,但是我正在努力返回前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
请问能给我任何帮助吗?谢谢!
答案 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