Добавление нулей слева в 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.
Джейсон

Возможный дубликат функции to_char (number) в postgres
Эван Кэрролл

Говоря о 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 этот ответ является стандартизированным методом вызова одной функции со строками формата. Используя RPAD / LPAD, вы конвертируете в строки, а затем обрабатываете строки. Используя to_char, вы просто указываете другой метод для преобразования строк.
Эван Кэрролл,

3
@EvanCarroll, они оба полезны - этот позволяет вам указать число для длины строки - другой требует знания 'fm', обозначающего режим заполнения, и позволяет указать изображение формата
Брайан Бернс

ПРЕДУПРЕЖДЕНИЕ: в отличие от классического 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)
Введите "help" для получения справки.

postgres => с sample_numbers (nr) как (
postgres (> значения (1), (11), (100)
postgres (>)
postgres-> выберите to_char (nr, 'fm000')
postgres-> from sample_numbers;
 to_char
---------
 001
 011
 100
(3 ряда)

postgres =>

Дополнительные сведения о формате изображения см. В руководстве:
http://www.postgresql.org/docs/current/static/functions-formatting.html


2
Если число слишком длинное, to_charпреобразует его в ###. Оо
Сэм Уоткинс

Мне любопытно, есть ли решение проблемы, когда если # если больше, чем указано в to_Char, оно преобразуется в ###. Есть ли способ указать минимальное количество нулей, а затем увеличить из этого числа? Например, если вы укажете 3 для lpad, числа будут отформатированы как 001 010 100 .. 1001
Майк Хеннесси

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.