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

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

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

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

Ответ 1

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

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

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

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

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

Согласно требованию вопроса, этот ответ работает, только если длина <= 3, если вы хотите что-то большее, вам нужно изменить строковую константу и две целочисленные константы на необходимую ширину. например, '0000' and VARCHAR(4)),4

Ответ 2

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

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

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

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

Ответ 3

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

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

Это имеет то преимущество, что возвращает строку '***' для n < 0 или n > 999, что является хорошим и очевидным индикатором входа вне границ. Остальные методы, перечисленные здесь, будут терпеть неудачу, усекая ввод в 3-значную подстроку.

Ответ 4

Здесь более общий метод для левого заполнения любой желаемой ширины:

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

[Вероятно, это не то, что вы хотели)

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

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 достаточной длины для хранения преобразованного результата с усечением.

Ответ 5

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

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

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

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

Ответ 6

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

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

Ответ 7

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

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 

Ответ 8

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

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

Ответ 9

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

SELECT RIGHT(1000 + field, 3)

Ответ 10

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

Я нашел этот код в поисках решения. Не уверен, что он работает на всех версиях 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.

Изменение: я вижу его так же, как @Anon сообщение.

Ответ 11

Написал это, потому что у меня были требования до определенной длины (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, @[email protected]) + @charInput, @prefLength)
else
    select @charInput

Возвращает 1234 входов

Ответ 12

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

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

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

Ответ 13

Просто это

Подобно:

DECLARE @DUENO BIGINT
SET @DUENO=5

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

Ответ 14

Для более динамичного подхода попробуйте это.

declare @val varchar(5)
declare @maxSpaces int
set @maxSpaces = 3
set @val = '3'
select concat(REPLICATE('0',@maxSpaces-len(@val)),@val)

Ответ 15

Попробуйте это с фиксированной длиной.

select right('000000'+'123',5)

select REPLICATE('0', 5 - LEN(123)) + '123'

Ответ 16

Я создал эту функцию, которая обслуживает bigint и один ведущий ноль или другой одиночный символ (возвращено максимум 20 символов) и учитывает длину результатов, меньшую длины входного числа:

create FUNCTION fnPadNum (
  @Num BIGINT --Number to be padded, @sLen BIGINT --Total length of results , @PadChar varchar(1))
  RETURNS VARCHAR(20)
  AS
  --Pads bigint with leading 0's
            --Sample:  "select dbo.fnPadNum(201,5,'0')" returns "00201"
            --Sample:  "select dbo.fnPadNum(201,5,'*')" returns "**201"
            --Sample:  "select dbo.fnPadNum(201,5,' ')" returns "  201"
   BEGIN
     DECLARE @Results VARCHAR(20)
     SELECT @Results = CASE 
     WHEN @sLen >= len(ISNULL(@Num, 0))
     THEN replicate(@PadChar, @sLen - len(@Num)) + CAST(ISNULL(@Num, 0) AS VARCHAR)
     ELSE CAST(ISNULL(@Num, 0) AS VARCHAR)
     END

     RETURN @Results
     END
     GO

     --Usage:
      SELECT dbo.fnPadNum(201, 5,'0')
      SELECT dbo.fnPadNum(201, 5,'*')
      SELECT dbo.fnPadNum(201, 5,' ')