У меня есть следующая таблица 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