У меня есть следующая таблица A:
id
----
1
2
12
123
1234
Мне нужно оставить значения id
с нулевым значением:
id
----
0001
0002
0012
0123
1234
Как я могу это достичь?
У меня есть следующая таблица A:
id
----
1
2
12
123
1234
Мне нужно оставить значения id
с нулевым значением:
id
----
0001
0002
0012
0123
1234
Как я могу это достичь?
Я считаю, что это может быть то, что вы ищете:
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, и если ваше значение min равно 1, вы увидите 0000000001
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
SQL Server теперь поддерживает функцию FORMAT начиная с версии 2012, поэтому:
SELECT FORMAT(id, '0000') FROM TableA
сделает свое дело.
Если ваш идентификатор или столбец находится в varchar
и представляет число, которое вы конвертируете первым:
SELECT FORMAT(CONVERT(INT,id), '0000') FROM TableA
Старый пост, но, возможно, это поможет кому-то:
Завершить, пока не получится 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
.
Это то, что я обычно использую, когда мне нужно ввести значение.
SET @PaddedValue = REPLICATE('0', @Length - LEN(@OrigValue)) + CAST(@OrigValue as VARCHAR)
Мне это понадобилось в функции на SQL-сервере и скорректировал Patrick немного.
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)
Я создал функцию:
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
Если кому-то все еще интересно, я нашел эту статью на DATABASE.GUIDE:
Левый отступ в 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
Проверьте статью, есть более глубокий анализ с примерами.
Что-то достаточно совместимое с 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))[email protected] else @str end
--Ans: 000123
set @str = '1234'
select case when len(@str) < @minlen then REPLICATE('0',@minlen-len(@str))[email protected] else @str end
--Ans: 001234
set @str = '123456'
select case when len(@str) < @minlen then REPLICATE('0',@minlen-len(@str))[email protected] else @str end
--Ans: 123456
set @str = '123456789'
select case when len(@str) < @minlen then REPLICATE('0',@minlen-len(@str))[email protected] else @str end
--Ans: 123456789
set @str = '123456789'
select case when len(@str) < @minlen then REPLICATE('0',@minlen-len(@str))[email protected] else @str end
--Ans: 123456789
set @str = 'NEFT 123456789'
select case when len(@str) < @minlen then REPLICATE('0',@minlen-len(@str))[email protected] 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))
Более эффективный способ:
Select id, LEN(id)
From TableA
Order by 2,1
The result :
id
----
1
2
12
123
1234