代码之家  ›  专栏  ›  技术社区  ›  Emac

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

  •  1
  • Emac  · 技术社区  · 8 年前

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

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

    返回118

    SELECT lpad(00118458582, 3, '0')
    

    SELECT left(00118458582::text, 3)
    

    返回118

    SELECT left(00118458582, 3)
    

    SELECT substring(00118458582::text, 1, 3)
    

    返回118

    我能找人帮忙吗?谢谢!

    3 回复  |  直到 8 年前
        1
  •  1
  •   Joe Ruder    8 年前

    选择子字符串(00118458582::文本,1,3) 返回118,因为它是一个数字118458582(前导零将自动删除),该数字转换为文本“118458582”,然后取前3个字符。

    如果你想取前三位数 然后 转换为可以使用的数字,请尝试:

    实际上可能是:

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

        2
  •  3
  •   404 Aniket Jha    8 年前

    ,但是当你跑的时候 SELECT 00118458582::INTEGER 118458582 . 因为这些类型中的前导零是没有意义的。因此,在表中永远不会出现示例中的情况(在查询窗口中前导零的硬编码数字之外),因为这些零不会存储在基于数字的数据类型字段中。

    因此,获得这种情况的唯一方法是当它们基于字符串时: SELECT '00118458582'::TEXT 回报 00118458582 . 在这一点上,你可以运行你喜欢的函数来得到前3个字符,例如。 SELECT LEFT('00118458582', 3) 又回来了 001 . 但是如果你打算把它转换成整数或者其他什么,就不要考虑前导零了。

        3
  •  0
  •   Gordon Linoff    8 年前

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

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

    select '000' || 00118458582::text