Ответы:
Я считаю, что это может быть то, что вы ищете:
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, а если ваше минимальное значение равно 1, вы увидите 0000000001
SQL Server теперь поддерживает функцию FORMAT, начиная с версии 2012, поэтому:
SELECT FORMAT(id, '0000') FROM TableA
сделает свое дело.
Если ваш идентификатор или столбец находится в varchar
и представляет число, которое вы сначала конвертируете:
SELECT FORMAT(CONVERT(INT,id), '0000') FROM TableA
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
Старый пост, но, возможно, это кому-то поможет:
Для завершения, пока не останется 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;
Попробуй это:
SELECT RIGHT(REPLICATE('0',4)+CAST(Id AS VARCHAR(4)),4) FROM [Table A]
- Пожалуйста, изучите это.
select FORMAT(1, 'd4');
select FORMAT(2, 'd4');
select FORMAT(12, 'd4');
select FORMAT(123, 'd4');
select FORMAT(1234, 'd4');
- Надеюсь, это поможет вам
Это работает для строк, целых и числовых:
SELECT CONCAT(REPLICATE('0', 4 - LEN(id)), id)
Где 4
желаемая длина. Работает для чисел, состоящих более чем из 4 цифр, возвращает пустую строку при NULL
значении.
Если кому-то все еще интересно, я нашел эту статью в DATABASE.GUIDE:
Left Padding в 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
Ознакомьтесь со статьей, там более подробный анализ с примерами.
Мне это нужно в функции на SQL-сервере, и я немного скорректировал ответ Патрика.
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'
Создать функцию:
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)
SELECT @var = LTRIM(RTRIM(@Text))
Я создал функцию:
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
Что-то достаточно совместимое с ODBC, если необходимо, может быть следующее:
select ifnull(repeat('0', 5 - (floor(log10(FIELD_NAME)) + 1)), '')
+ cast (FIELD as varchar(10))
from TABLE_NAME
Это основано на том факте, что количество цифр для числа с основанием 10 можно найти по интегральной составляющей его журнала. Из этого мы можем вычесть это из желаемой ширины отступа. Repeat вернется null
для значений меньше 1, так что нам нужно ifnull
.
Мое решение неэффективно, но помогло мне в ситуации, когда значения (номера банковских чеков и номера банковских переводов) хранились как 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))+@str else @str end
--Ans: 000123
set @str = '1234'
select case when len(@str) < @minlen then REPLICATE('0',@minlen-len(@str))+@str else @str end
--Ans: 001234
set @str = '123456'
select case when len(@str) < @minlen then REPLICATE('0',@minlen-len(@str))+@str else @str end
--Ans: 123456
set @str = '123456789'
select case when len(@str) < @minlen then REPLICATE('0',@minlen-len(@str))+@str else @str end
--Ans: 123456789
set @str = '123456789'
select case when len(@str) < @minlen then REPLICATE('0',@minlen-len(@str))+@str else @str end
--Ans: 123456789
set @str = 'NEFT 123456789'
select case when len(@str) < @minlen then REPLICATE('0',@minlen-len(@str))+@str else @str end
--Ans: NEFT 123456789
Простой пример:
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))
Я создал для этого функцию, в которой вы можете указать желаемую длину выходного символа:
CREATE FUNCTION [dbo].[udfLeadingZero]
(
@String VARCHAR(MAX)
, @Len INT
)
RETURNS VARCHAR(MAX)
BEGIN
SET @String = RIGHT(REPLICATE('0',@Len)+@String,@Len)
RETURN @String
END
GO