Форматирование чисел путем заполнения ведущими нулями в SQL Server
у нас есть старая таблица SQL, которая использовалась SQL Server 2000 в течение почти 10 лет.
в нем наши номера значков сотрудников хранятся как char(6)
С 000001
до 999999
.
сейчас я пишу веб-приложение, и мне нужно хранить номера значков сотрудников.
в моей новой таблице я мог бы взять короткий путь и скопировать старую таблицу, но я надеюсь на лучшую передачу данных, меньший размер и т. д., Просто сохранив int
значения 1
to 999999
.
в C#, я могу быстро отформатировать int
значение для номера значка с помощью
public static string GetBadgeString(int badgeNum) {
return string.Format("{0:000000}", badgeNum);
// alternate
// return string.Format("{0:d6}", badgeNum);
}
как бы я изменил этот простой SQL-запрос, чтобы отформатировать возвращаемое значение?
SELECT EmployeeID
FROM dbo.RequestItems
WHERE ID=0
если EmployeeID
это 7135, этот запрос должен вернуть 007135
.
12 ответов:
измените число 6 на то, что ваша общая длина должна быть:
SELECT REPLICATE('0',6-LEN(EmployeeId)) + EmployeeId
Если столбец является INT, вы можете использовать RTRIM для неявного преобразования его в VARCHAR
SELECT REPLICATE('0',6-LEN(RTRIM(EmployeeId))) + RTRIM(EmployeeId)
и код, чтобы удалить эти 0s и получить обратно "реальный" номер:
SELECT RIGHT(EmployeeId,(LEN(EmployeeId) - PATINDEX('%[^0]%',EmployeeId)) + 1)
просто используйте функцию форматирования (работает на SQL Server 2012 или новее):
SELECT FORMAT(EmployeeID, '000000') FROM dbo.RequestItems WHERE ID=0
Ссылка:http://msdn.microsoft.com/en-us/library/hh213505.aspx
вы можете изменить свою процедуру таким образом
SELECT Right('000000' + CONVERT(NVARCHAR, EmployeeID), 6) AS EmpIDText, EmployeeID FROM dbo.RequestItems WHERE ID=0
однако это предполагает, что ваш
EmployeeID
- это числовое значение, и этот код изменяет результат на строку, я предлагаю снова добавить исходное числовое значениеEDIT конечно, я не читал внимательно вопрос выше. Он говорит, что поле это
char(6)
поэтому EmployeeID не является числовым значением. Хотя этот ответ по-прежнему имеет значение как таковое, он не является правильным ответом на вопрос выше.
ненавидел необходимость конвертировать int, и это кажется намного проще. Может даже работать лучше, так как есть только одно преобразование строк и простое добавление.
выберите справа (1000000 + EmployeeId, 6) ...
просто убедитесь, что" 1000000 " имеет по крайней мере столько нулей, сколько требуется размер.
Я размещаю все в одном месте, все работает для меня, чтобы положить с 4 ведущих нуля :)
declare @number int = 1; print right('0000' + cast(@number as varchar(4)) , 4) print right('0000' + convert(varchar(4), @number) , 4) print right(replicate('0',4) + convert(varchar(4), @number) , 4) print cast(replace(str(@number,4),' ','0')as char(4)) print format(@number,'0000')
другой способ, просто для полноты.
DECLARE @empNumber INT = 7123 SELECT STUFF('000000', 6-LEN(@empNumber)+1, LEN(@empNumber), @empNumber)
или, согласно вашему запросу
SELECT STUFF('000000', 6-LEN(EmployeeID)+1, LEN(EmployeeID), EmployeeID) AS EmployeeCode FROM dbo.RequestItems WHERE ID=0
как чистый, как он мог бы получить и дать область замены с переменными:
Select RIGHT(REPLICATE('0',6) + EmployeeID, 6) from dbo.RequestItems WHERE ID=0
С версии 2012 и дальше вы можете использовать
SELECT FORMAT(EmployeeID,'000000') FROM dbo.RequestItems WHERE ID=0
SELECT replicate('0', 6 - len(employeeID)) + convert(varchar, employeeID) as employeeID FROM dbo.RequestItems WHERE ID=0