Функция PadLeft в T-SQL - PullRequest
       42

Функция PadLeft в T-SQL

103 голосов
/ 04 апреля 2011

У меня есть следующая таблица A:

id
----
1
2
12
123
1234

Мне нужно заполнить значения id слева нулями:

id
----
0001
0002
0012
0123
1234

Как мне этого добиться?

Ответы [ 16 ]

188 голосов
/ 04 апреля 2011

Я думаю, это то, что вы ищете:

SELECT padded_id = REPLACE(STR(id, 4), SPACE(1), '0') 

FROM tableA

или

SELECT REPLACE(STR(id, 4), SPACE(1), '0') AS [padded_id]

FROM tableA

Я не проверял синтаксис во втором примере. Я не уверен, что это работает на 100% - это может потребовать некоторой настройки - но оно передает общую идею о том, как получить желаемый результат.

EDIT

Для решения проблем, перечисленных в комментариях ...

@ pkr298 - Да STR работает только с числами ... Поле OP является идентификатором ... отсюда только число.

@ Desolator - Конечно, это не сработает ... Первый параметр имеет длину 6 символов. Вы можете сделать что-то вроде:

SELECT REPLACE(STR(id,
(SELECT LEN(MAX(id)) + 4 FROM tableA)), SPACE(1), '0') AS [padded_id] FROM tableA

теоретически это должно привести к смещению ворот ... если число увеличивается, оно должно ВСЕГДА работать ... независимо от того, равно ли оно 1 или 123456789 ...

Так что, если ваше максимальное значение равно 123456 ... вы увидите 0000123456, а если ваше минимальное значение равно 1, вы увидите 0000000001

58 голосов
/ 04 апреля 2011
declare @T table(id int)
insert into @T values
(1),
(2),
(12),
(123),
(1234)

select right('0000'+convert(varchar(4), id), 4)
from @T

Результат

----
0001
0002
0012
0123
1234
50 голосов
/ 24 ноября 2014

SQL Server теперь поддерживает функцию FORMAT , начиная с версии 2012, поэтому:

SELECT FORMAT(id, '0000') FROM TableA

сделает свое дело.

Если ваш идентификатор или столбец находится в varchar и представляет собой число, которое вы конвертируете первым:

SELECT FORMAT(CONVERT(INT,id), '0000') FROM TableA
36 голосов
/ 11 октября 2013

Старый пост, но, возможно, это кому-нибудь поможет:

Заполнить до 4 непустых символов:

SELECT RIGHT ('0000'+COLUMNNAME, 4) FROM TABLENAME;

до 10:

SELECT RIGHT ('0000000000'+COLUMNNAME, 10) FROM TABLENAME;

Если столбец числовой , сначала преобразуйте его в varchar с таким кодом:

Select RIGHT('0000'+Convert(nvarchar(20), COLUMNNAME), 4)
From TABLENAME

И до 10 заполнить числовым полем:

SELECT RIGHT ('0000000000'+Convert(nvarchar(20), COLUMNNAME), 10) FROM TABLENAME;
12 голосов
/ 30 мая 2011

Попробуйте это:

SELECT RIGHT(REPLICATE('0',4)+CAST(Id AS VARCHAR(4)),4) FROM [Table A]
8 голосов
/ 24 декабря 2015

- Пожалуйста, посмотрите на них.

select FORMAT(1, 'd4');
select FORMAT(2, 'd4');
select FORMAT(12, 'd4');
select FORMAT(123, 'd4');
select FORMAT(1234, 'd4');

- Я надеюсь, что это поможет вам

5 голосов
/ 13 июля 2016

Это работает для строк, целых чисел и чисел:

SELECT CONCAT(REPLICATE('0', 4 - LEN(id)), id)

Где 4 - желаемая длина.Работает для чисел с более чем 4 цифрами, возвращает пустую строку со значением NULL.

2 голосов
/ 12 мая 2015

Это то, что я обычно использую, когда мне нужно заполнить значение.

SET @PaddedValue = REPLICATE('0', @Length - LEN(@OrigValue)) + CAST(@OrigValue as VARCHAR)
1 голос
/ 30 января 2019

Если кому-то все еще интересно, я нашел эту статью на DATABASE.GUIDE:
Левый отступ в SQL Server - 3 эквивалента LPAD ()

Короче говоря, в этой статье упоминается 3 метода.
Допустим, ваш id = 12, и вам нужно, чтобы он отображался как 0012.

Метод 1 - Используйте функцию ВПРАВО ()
Первый метод использует функцию RIGHT (), которая возвращает только крайнюю правую часть строки после добавления начальных нулей.

SELECT RIGHT('00' + '12', 4);

Результат:
0012

Метод 2 - Используйте комбинацию RIGHT () и REPLICATE ()
Этот метод почти такой же, как и предыдущий, с той лишь разницей, что я просто заменяю три нуля функцией REPLICATE ():

SELECT RIGHT(REPLICATE('0', 2) + '12', 4);

Результат:
0012

Метод 3 - Используйте комбинацию REPLACE () и STR ()
Этот метод происходит под совершенно другим углом зрения к предыдущим методам:

SELECT REPLACE(STR('12', 4),' ','0');

Результат:
0012

Ознакомьтесь со статьей, есть более глубокий анализ с примерами.

1 голос
/ 03 ноября 2017

Я создал функцию:

CREATE FUNCTION [dbo].[fnPadLeft](@int int, @Length tinyint)
RETURNS varchar(255) 
AS 
BEGIN
    DECLARE @strInt varchar(255)

    SET @strInt = CAST(@int as varchar(255))
    RETURN (REPLICATE('0', (@Length - LEN(@strInt))) + @strInt);
END;

Использование: выберите dbo.fnPadLeft (123, 10)

Возвращает: 0000000123

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...