У меня есть строка длиной до 3 символов, когда она впервые создается в SQL Server 2008 R2.
Я хотел бы заполнить ее ведущими нулями, так что если ее исходное значение было '1', то новое значение будет '001'. Или если его исходное значение было '23', то новое значение будет '023'. Или если его первоначальное значение '124', то новое значение равно первоначальному.
Я использую SQL Server 2008 R2. Как я могу сделать это с помощью T-SQL?
Если поле уже является строкой, это сработает
SELECT RIGHT('000'+ISNULL(field,''),3)
Если вы хотите, чтобы нули отображались как '000'
Это может быть целое число - тогда вам нужно
SELECT RIGHT('000'+CAST(field AS VARCHAR(3)),3)
Как требует вопрос, этот ответ работает только если длина <= 3, если вы хотите что-то большее, вам нужно изменить строковую константу и две целочисленные константы на необходимую ширину. например
'0000' и VARCHAR(4)),4
.
Хотя вопрос был для SQL сервера 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')
Это имеет то преимущество, возвращая строку'***'
для п < 0 или П > 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)
Однако, если вы'повторно дело с отрицательными значениями, и обивка с ведущими нулями, ни это, ни другие предложенные методики будут работать. Вы'll получить что-то вроде этого:
00-123
[Наверное, не то, что вы хотели]
Так и amp;покер румы; вы'будете иметь, чтобы перепрыгнуть через некоторые дополнительные обручи здесь's один подход, правильно формата отрицательных чисел:
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
)
Следует отметить, что вызывает преобразование () нужно указать
[Н]тип varchar` достаточной длины, чтобы держать преобразованный результат с усечением.
Вот вариант Хоган'ы ответ, который я использую в SQL Server, Экспресс-выпуск 2012:
SELECT RIGHT(CONCAT('000', field), 3)
Вместо того, чтобы беспокоиться, если поле является строкой или нет, я просто функция concat
, поскольку он'МР выводить строку в любом случае. Кроме того, если поле может быть null, это означает, с помощью функции isnull может потребоваться, чтобы избежать функцию получения результата "нуль".
SELECT RIGHT(CONCAT('000', ISNULL(field,'')), 3)
Используйте эту функцию, который подходит для любой ситуации.
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)
Я знаю, это старый билет я просто думал поделиться.
Я нашел этот код ищет решение. Не уверен, если это работает на всех версий 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 по ул. и правильное количество нулей прибавится. Вы можете увеличить или уменьшить его. Нет необходимости, чтобы получить длину на 23.
Редактировать: я вижу его таким же, как @Анон пост.
У меня была аналогичная проблема с колонкой целое число в качестве входных данных, когда мне нужен фиксированный размер тип varchar (или строки) вывода. Например, 1 к '01', 12 для '12'. Этот код работает:
SELECT RIGHT(CONCAT('00',field::text),2)
Если входными данными является также столбец varchar, то вы можете избежать части отливки.
Написал это, потому что у меня требования до определенной длины (9). Колодки слева с @шаблон только тогда, когда вход для заполнения. Всегда должна возвращать длину, определенную в @выкройка.
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
Простой заключается в том, что
Как:
DECLARE @DUENO BIGINT
SET @DUENO=5
SELECT 'ND'+STUFF('000000',6-LEN(RTRIM(@DueNo))+1,LEN(RTRIM(@DueNo)),RTRIM(@DueNo)) DUENO
Я создал эту функцию, которая предназначена для 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,' ')