การเว้นศูนย์ไปทางซ้ายใน postgreSQL


103

ฉันค่อนข้างใหม่กับ PostgreSQL และฉันรู้วิธีเติมตัวเลขด้วยศูนย์ทางด้านซ้ายใน SQL Server แต่ฉันกำลังดิ้นรนเพื่อหาสิ่งนี้ใน PostgreSQL

ฉันมีคอลัมน์ตัวเลขที่จำนวนหลักสูงสุดคือ 3 และนาทีคือ 1: ถ้าเป็นหนึ่งหลักจะมีเลขศูนย์สองตัวอยู่ทางซ้ายและถ้าเป็น 2 หลักก็จะมี 1 เช่น 001, 058, 123

ใน SQL Server ฉันสามารถใช้สิ่งต่อไปนี้:

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

สิ่งนี้ไม่มีอยู่ใน PostgreSQL ความช่วยเหลือใด ๆ จะได้รับการชื่นชม


2
การใช้ Google เป็นว่าวิธีการที่ฉันพบหน้านี้ มันเป็นผลการค้นหาอันดับหนึ่งของ Google
Jason


การพูดของ SQL Server, พวกเขามีฟังก์ชั่นที่จะช่วยให้คุณใช้format() format(Column1,'000') as Column2
Manngo

คำตอบ:


179

คุณสามารถใช้rpadและlpadฟังก์ชันเพื่อวางหมายเลขไปทางขวาหรือทางซ้ายตามลำดับ โปรดทราบว่าสิ่งนี้ใช้ไม่ได้โดยตรงกับตัวเลขดังนั้นคุณจะต้องใช้::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 คุณเพียงระบุวิธีการอื่นสำหรับการสตริง
Evan Carroll

3
@EvanCarroll ทั้งสองมีประโยชน์ - อันนี้ช่วยให้คุณระบุตัวเลขสำหรับความยาวสตริง - อีกอันต้องรู้ว่า 'fm' หมายถึงโหมดเติมและให้คุณระบุรูปแบบรูปภาพ
Brian Burns

คำเตือน: ต่างจากแบบคลาสสิกprintfฟังก์ชันที่เกี่ยวกับกระดูกเหล่านี้จะตัดสตริงของคุณให้มีขนาดเล็กลงอย่างเงียบ ๆ หากไม่พอดี ดังนั้นคุณอาจต้องใช้case when length(foo) ...มัน
Sam Watkins

62

มีto_char()ฟังก์ชั่นเพื่อจัดรูปแบบตัวเลข:

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

fmคำนำหน้า (โหมด "เติม") หลีกเลี่ยงช่องว่างนำใน varchar เกิด 000เพียงแค่กำหนดจำนวนของตัวเลขที่คุณต้องการที่จะมี

psql (9.3.5)
พิมพ์ "help" เพื่อขอความช่วยเหลือ

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


3
หากตัวเลขยาวเกินไปให้to_charแปลงเป็น ### Oo
Sam Watkins

1
ฉันอยากรู้ว่ามีวิธีแก้ปัญหาไหมโดยที่ # ถ้ายาวกว่าที่ระบุไว้ใน to_Char จะแปลงเป็น ### จะมี # ศูนย์ขั้นต่ำที่เฉพาะเจาะจงหรือไม่จากนั้นจำนวนที่มากขึ้นจะเพิ่มขึ้นจากนั้นหรือไม่? ตัวอย่างเช่นหากคุณระบุ 3 สำหรับ lpad ตัวเลขจะอยู่ในรูปแบบเช่น 001 010 100 .. 1001
mike hennessy

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.