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

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

id
----
1
2
12
123
1234

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

id
----
0001
0002
0012
0123
1234

Как я могу это достичь?

Ответ 1

Я считаю, что это может быть то, что вы ищете:

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% - это может потребовать некоторой настройки, но оно передает общую идею о том, как получить желаемый результат.

ИЗМЕНИТЬ

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

@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, и если ваше значение min равно 1, вы увидите 0000000001

Ответ 2

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

Ответ 3

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

SELECT FORMAT(id, '0000') FROM TableA

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

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

SELECT FORMAT(CONVERT(INT,id), '0000') FROM TableA

Ответ 4

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

Завершить, пока не получится 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;

Ответ 5

Попробуйте следующее:

SELECT RIGHT(REPLICATE('0',4)+CAST(Id AS VARCHAR(4)),4) FROM [Table A]

Ответ 6

- Пожалуйста, изучите их.

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

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

Ответ 7

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

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

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

Ответ 8

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

SET @PaddedValue = REPLICATE('0', @Length - LEN(@OrigValue)) + CAST(@OrigValue as VARCHAR)

Ответ 9

Мне это понадобилось в функции на SQL-сервере и скорректировал Patrick немного.

declare @dossierId int = 123
declare @padded_id varchar(7)


set @padded_id = REPLACE(
              SPACE(7 - LEN(@dossierId)) + convert(varchar(7), @dossierId), 
              SPACE(1),  
              '0') 

SELECT @dossierId as '@dossierId'
      ,SPACE(LEN(@dossierId)) + convert(varchar(7)
      ,@dossierId) as withSpaces
      ,@padded_id as '@padded_id'

Ответ 10

Создать функцию:

    Create FUNCTION [dbo].[PadLeft]
      (
        @Text NVARCHAR(MAX) ,
        @Replace NVARCHAR(MAX) ,
        @Len INT
      )
RETURNS NVARCHAR(MAX)
AS
    BEGIN 


        DECLARE @var NVARCHAR(MAX) 

        SELECT @var = ISNULL(LTRIM(RTRIM(@Text)) , '')


        RETURN   RIGHT(REPLICATE(@Replace,@Len)+ @var, @Len)


    END

Пример:

Select dbo.PadLeft('123456','0',8)

Ответ 11

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

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

Ответ 12

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

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

Метод 1 - Используйте функцию RIGHT()
Первый метод использует функцию 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

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

Ответ 13

Что-то достаточно совместимое с ODBC, если необходимо, может быть следующим:

select ifnull(repeat('0', 5 - (floor(log10(FIELD_NAME)) + 1)), '')
        + cast (FIELD as varchar(10))
  from TABLE_NAME

Это основано на том, что количество цифр для номера базы-10 может быть найдено интегральной составляющей его журнала. Из этого мы можем вычесть его из требуемой ширины заполнения. Repeat вернет null для значений ниже 1, поэтому нам нужно ifnull.

Ответ 14

Мое решение неэффективно, но помогло мне в ситуации, когда значения (номера банковских проверок и номер перевода перевода) были сохранены как varchar, где некоторые записи имели с ними числовые значения с буквой, и мне пришлось отложить, если длина меньше 6 символов.

Мысль делиться, если кто-то сталкивается с той же ситуацией

declare @minlen int = 6
declare @str varchar(20)

set @str = '123'
select case when len(@str) < @minlen then REPLICATE('0',@minlen-len(@str))[email protected] else @str end
--Ans: 000123

set @str = '1234'
select case when len(@str) < @minlen then REPLICATE('0',@minlen-len(@str))[email protected] else @str end
--Ans: 001234

set @str = '123456'
select case when len(@str) < @minlen then REPLICATE('0',@minlen-len(@str))[email protected] else @str end
--Ans: 123456

set @str = '123456789'
select case when len(@str) < @minlen then REPLICATE('0',@minlen-len(@str))[email protected] else @str end
--Ans: 123456789

set @str = '123456789'
select case when len(@str) < @minlen then REPLICATE('0',@minlen-len(@str))[email protected] else @str end
--Ans: 123456789


set @str = 'NEFT 123456789'
select case when len(@str) < @minlen then REPLICATE('0',@minlen-len(@str))[email protected] else @str end
--Ans: NEFT 123456789

Ответ 15

Простой пример будет

    DECLARE @number INTEGER
    DECLARE @length INTEGER
    DECLARE @char   NVARCHAR(10)
    SET @number = 1
    SET @length = 5
    SET @char = '0'

    SELECT FORMAT(@number, replicate(@char, @length))

Ответ 16

Более эффективный способ:

Select id, LEN(id)
From TableA
Order by 2,1 

The result :
id
----
1
2
12
123
1234