Поместите строку с ведущими нулями, чтобы она длилась 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,' ')