Поместите строку с ведущими нулями, чтобы в SQL Server 2008 было 3 символа

У меня есть строка длиной до 3 символов, когда она впервые создана в SQL Server 2008 R2.

Я хотел бы дополнить его ведущими нулями, поэтому, если его исходное значение было "1", то новое значение будет "001". Или если исходное значение было '23' новое значение '023'. Или если его исходное значение '124', то новое значение такое же, как исходное значение.

Я использую SQL Server 2008 R2. Как это сделать с помощью T-SQL?

13 ответов


Если поле уже является строкой, это будет работать

 SELECT RIGHT('000'+ISNULL(field,''),3)

Если вы хотите, чтобы нули отображались как "000"

это может быть целое число-тогда вы захотите

 SELECT RIGHT('000'+CAST(field AS VARCHAR(3)),3)

работает, если длина


хотя вопрос был для SQL Server 2008 R2, в случае, если кто-то читает это с версией 2012 и выше, с тех пор это стало намного проще с помощью формат.

Вы можете либо пройти строка стандартного числового формата или строка пользовательского числового формата в качестве аргумента формата (спасибо Вадим Овчинников за эту подсказку).

для этого вопроса, например, код как

DECLARE @myInt INT = 1;
-- One way using a standard numeric format string
PRINT FORMAT(@myInt,'D3');
-- Other way using a custom numeric format string
PRINT FORMAT(@myInt,'00#');

выходы

001
001

безопасный метод:

SELECT REPLACE(STR(n,3),' ','0')

это имеет то преимущество, что возвращает строку '***' для n 999,что является хорошим и очевидным индикатором выхода за пределы. Другие методы, перечисленные здесь, потерпят неудачу молча, усекая вход в 3-символьную подстроку.


вот более общая техника для левой прокладки до любой желаемой ширины:

declare @x     int     = 123 -- value to be padded
declare @width int     = 25  -- desired width
declare @pad   char(1) = '0' -- pad character

select right_justified = replicate(
                           @pad ,
                           @width-len(convert(varchar(100),@x))
                           )
                       + convert(varchar(100),@x)

однако, если вы имеете дело с отрицательными значениями и заполнением ведущими нулями, ни этот, ни другой предлагаемый метод не будет работать. Вы получите что-то, что выглядит так:

00-123

[наверное, не то, что вы хотели]

Итак ... вам придется прыгать через некоторые дополнительные обручи вот один подход, который будет правильно форматировать отрицательный цифры:

declare @x     float   = -1.234
declare @width int     = 20
declare @pad   char(1) = '0'

select right_justified = stuff(
         convert(varchar(99),@x) ,                            -- source string (converted from numeric value)
         case when @x < 0 then 2 else 1 end ,                 -- insert position
         0 ,                                                  -- count of characters to remove from source string
         replicate(@pad,@width-len(convert(varchar(99),@x)) ) -- text to be inserted
         )

отметим, что convert() вызовы должны указывать [n]varchar достаточной длины, чтобы удерживать преобразованный результат с усечением.


вот вариант ответа Хогана, который я использую в SQL Server Express 2012:

SELECT RIGHT(CONCAT('000', field), 3)

вместо того, чтобы беспокоиться, является ли поле строкой или нет, я просто CONCAT it, так как он все равно выведет строку. Кроме того, если поле может быть NULL, используя ISNULL может потребоваться, чтобы избежать получения функции NULL результаты.

SELECT RIGHT(CONCAT('000', ISNULL(field,'')), 3)

Я всегда считал следующий метод очень полезным.

REPLICATE('0', 5 - LEN(Job.Number)) + CAST(Job.Number AS varchar) as 'NumberFull'

используйте эту функцию, которая подходит для каждой ситуации.

CREATE FUNCTION dbo.fnNumPadLeft (@input INT, @pad tinyint)
RETURNS VARCHAR(250)
AS BEGIN
    DECLARE @NumStr VARCHAR(250)

    SET @NumStr = LTRIM(@input)

    IF(@pad > LEN(@NumStr))
        SET @NumStr = REPLICATE('0', @Pad - LEN(@NumStr)) + @NumStr;

    RETURN @NumStr;
END

пример вывода

SELECT [dbo].[fnNumPadLeft] (2016,10) -- returns 0000002016
SELECT [dbo].[fnNumPadLeft] (2016,5) -- returns 02016
SELECT [dbo].[fnNumPadLeft] (2016,2) -- returns 2016
SELECT [dbo].[fnNumPadLeft] (2016,0) -- returns 2016 

для тех, кто хочет обновить свои существующие данные запрос:

update SomeEventTable set eventTime=RIGHT('00000'+ISNULL(eventTime, ''),5)

для целых чисел вы можете использовать неявное преобразование из int в varchar:

SELECT RIGHT(1000 + field, 3)

написал это, потому что у меня были требования к определенной длине (9). Колодки слева с @ pattern только тогда, когда вход нуждается в заполнении. Всегда следует возвращать длину, определенную в @pattern.

declare @charInput as char(50) = 'input'

--always handle NULL :)
set @charInput = isnull(@charInput,'')

declare @actualLength as int = len(@charInput)

declare @pattern as char(50) = '123456789'
declare @prefLength as int = len(@pattern)

if @prefLength > @actualLength
    select Left(Left(@pattern, @prefLength-@actualLength) + @charInput, @prefLength)
else
    select @charInput

возвращает 1234input


У меня была аналогичная проблема с целочисленным столбцом в качестве ввода, когда мне нужен был выход varchar (или string) фиксированного размера. Например, с 1 по 01, с 12 по 12. Этот код работает:

SELECT RIGHT(CONCAT('00',field::text),2)

если вход также является столбцом varchar, вы можете избежать части литья.


Я знаю его старый билет, я просто думал поделиться им.

Я нашел этот код в поисках решения. Не уверен, что он работает на всех версиях MSSQL у меня есть MSSQL 2016.

declare @value as nvarchar(50) = 23
select REPLACE(STR(CAST(@value AS INT) + 1,4), SPACE(1), '0') as Leadingzero

возвращает "0023" 4 в функции STR-это общая длина, включая значение. Пример 4, 23 и 123 будут иметь 4 в STR, и будет добавлено правильное количество нулей. Вы можете увеличить или уменьшить его. Нет необходимости получать длину на 23.

Edit: я вижу то же самое как @ Anon post.


это просто

Как:

DECLARE @DUENO BIGINT
SET @DUENO=5

SELECT 'ND'+STUFF('000000',6-LEN(RTRIM(@DueNo))+1,LEN(RTRIM(@DueNo)),RTRIM(@DueNo)) DUENO