Как преобразовать int в char с ведущими нулями?


98

Мне нужно преобразовать поле данных int в nvarchar с ведущими нулями

пример:

1 преобразовать в '001'

867 преобразовать в 000867 и т. Д.

Спасибо.


Это мой ответ через 4 часа ...

Я протестировал этот сценарий T-SQL и у меня все отлично работает!

DECLARE @number1 INT, @number2 INT

SET @number1 = 1

SET @number2 = 867

SELECT RIGHT('000' + CAST(@number1 AS NCHAR(3)), 3 ) AS NUMBER_CONVERTED

SELECT RIGHT('000000' + CAST(@number2 AS NCHAR(6)), 6 ) AS NUMBER_CONVERTED

Я создал эту пользовательскую функцию

Код T-SQL:

CREATE FUNCTION CIntToChar(@intVal BIGINT, @intLen Int) RETURNS nvarchar(20)
AS
BEGIN

    -- BIGINT = 2^63-1 (9,223,372,036,854,775,807) Max size number

    -- @intlen contains the string size to return
    IF @intlen > 20
       SET @intlen = 20

    RETURN REPLICATE('0',@intLen-LEN(RTRIM(CONVERT(nvarchar(20),@intVal)))) 
        + CONVERT(nvarchar(20),@intVal)

END

Пример :

ВЫБЕРИТЕ dbo.CIntToChar (867, 6) как COD_ID

ВЫВОД

000867


1
В вашем первом примере CAST должны быть типами NVARCHAR, а не NCHAR, потому что NCHAR (3) всегда имеет длину 3.
nzeemin 01

Ответы:


100

Попробуй это: select right('00000' + cast(Your_Field as varchar(5)), 5)

Результат будет состоять из 5 цифр, например: 00001, ...., 01234.


1
Обратите внимание, что для postgres вам нужно заменить + на ||, поэтомуselect right('00000' || cast(Your_Field as varchar(5)), 5)
ronedg

57

Вы также можете использовать функцию FORMAT (), представленную в SQL Server 2012 . http://technet.microsoft.com/library/hh213505.aspx

DECLARE @number1 INT, @number2 INT

SET @number1 = 1
SET @number2 = 867

SELECT FORMAT(@number1, 'd10')
SELECT FORMAT(@number2, 'd10')

Я соглашусь с SQL2012, но для SQL 2008r2 и старше мое решение даст результат
GoldBishop

1
Только что протестировал FORMAT Sql Server 2012 - он медленный, как «одно число за несколько секунд». Держись подальше.
Muposat

@Muposat, не могли бы вы предоставить код для этого теста? Это очень важно. Заранее спасибо.
Домингес,

3
@Diomedes Domínguez прошел год, так что у меня больше нет оригинального теста. Я просто провел еще один тест на действительно быстром сервере и получил 32 секунды на форматирование 1 миллиона чисел. Не конец света, но решение, опубликованное Нгуен Траном, делает это за 1 секунду. Для тестирования просто создайте цикл от @i int = 0 до 10000000.
Muposat 02

22

Используйте, REPLICATEчтобы вам не приходилось жестко кодировать все ведущие нули:

DECLARE @InputStr int
       ,@Size     int
SELECT @InputStr=123
      ,@Size=10

PRINT REPLICATE('0',@Size-LEN(RTRIM(CONVERT(varchar(8000),@InputStr)))) + CONVERT(varchar(8000),@InputStr)

ВЫВОД:

0000000123

13

Не для High-Jack, но следует отметить, что вам нужно использовать (N) VARCHAR вместо типа данных (N) CHAR.

RIGHT('000' + CAST(@number1 AS NCHAR(3)), 3 )

Вышеуказанный сегмент не даст правильного ответа от SQL 2005

RIGHT('000' + CAST(@number1 AS NVARCHAR(3)), 3 )

Вышеупомянутый сегмент даст желаемый ответ от SQL 2005

Varchar предоставит вам нужную длину префикса на лету. Где, поскольку тип данных фиксированной длины потребует обозначения и корректировки длины.


6

Я люблю использовать

DECLARE @Length int
DECLARE @Number int
SET @Length = 9
SET @Number = 4

select right( POWER(10, @Length) + @Number, @Length)

это дает мне

000000004

1
Кажется немного взломанным, но у меня это сработало в DB2. Я не смог заставить ответы выше работать.
Натан М.

2
Мне тоже это нравится. Если длина жестко запрограммирована, вы можете просто использовать RIGHT(1000+Number, 3)- красиво, коротко и быстро
maf-soft

1
Это работает на всех вариантах SQL Server, начиная с 2005 года. Предпочтительный ответ.
Fandango68

1
Что означает 10?
Fandango68

1
@ Fandango68 '10' в 'POWER (10, @Length)' выше, потому что мы используем арифметику с основанием 10 - поэтому литерал '1000' в maf-soft ответе выше эквивалентен POWER (10, 3) - 10 ^ 3 = 1000.
qxotk 03

4

Тип данных «int» не может содержать более 10 цифр, кроме того, функция «Len ()» работает с целыми числами, поэтому нет необходимости преобразовывать int в строку перед вызовом функции len ().

Наконец, вы не учитываете случай, когда размер вашего int> общего количества цифр, которые вы хотите дополнить (@intLen).

Поэтому более краткое / правильное решение:

CREATE FUNCTION rf_f_CIntToChar(@intVal Int, @intLen Int) RETURNS nvarchar(10)
AS
BEGIN
    IF @intlen > 20 SET @intlen = 20
    IF @intlen < LEN(@intVal) RETURN RIGHT(CONVERT(nvarchar(10), @intVal), @intlen)
    RETURN REPLICATE('0', @intLen - LEN(@intVal)) + CONVERT(nvarchar(10), @intVal)
END

3

Не очень элегантно, но я добавляю заданное значение с тем же количеством начальных нулей, которое мне нужно, к числовому, которое хочу преобразовать, и использую функцию ВПРАВО.

Пример:

SELECT RIGHT(CONVERT(CHAR(7),1000000 + @number2),6)

Результат: '000867'


2

Однострочное решение ( само по себе ) для SQL Server 2008 или выше:

DECLARE @DesiredLenght INT = 20;
SELECT 
    CONCAT(
        REPLICATE(
            '0',
            (@DesiredLenght-LEN([Column])) * (1+SIGN(@DesiredLenght-LEN([Column])) / 2) ),
        [Column])
FROM Table;

Умножение на SIGNвыражение эквивалентно MAX(0, @DesiredLenght-LEN([Column])). Проблема в том, что MAX()принимает только один аргумент ...


1

Я нашел хорошую статью здесь :

Заполнение строки ведущими нулями

Мне приходилось делать это много раз при выводе экспорта данных фиксированной длины, где, например, числовой столбец имеет длину 9 символов, и вам нужно поставить префикс с ведущими нулями.


1
    select right('000' + convert(varchar(3),id),3) from table

    example
    declare @i int
    select @i =1

select right('000' + convert(varchar(3),@i),3)

Кстати, если это столбец int, он все равно не сохранит нули.Просто сделайте это на уровне представления или, если вам действительно нужно, в SELECT


1

Была такая же проблема, вот как я решил ... Просто и элегантно. «4» - это то, какой длины должна быть строка, независимо от того, какое целое число передано, оно будет дополняться нулями до «4».

STUFF(SomeVariableOrField,1,0,REPLICATE('0',4 - LEN(SomeVariableOrField)))

1

В моем случае я хотел, чтобы мое поле имело ведущие 0 в 10-символьном поле (NVARCHAR (10)). Исходный файл не имеет начальных 0, необходимых для присоединения к другой таблице. Произошло это просто из-за того, что он был на SQL Server 2008R2:

Установите поле = right (('0000000000' + [Поле]), 10) (Невозможно использовать Format (), так как это до SQL2012)

Выполнено по существующим данным. Таким образом, 1 или 987654321 по-прежнему заполнят все 10 пробелов начальными нулями.

Поскольку новые данные импортируются, а затем выгружаются в таблицу через базу данных Access, я могу использовать формат ([Поле], «0000000000») при добавлении из Access в таблицу сервера SQL для любых новых записей.


0
DECLARE @number1 INT, @number2 INT

SET @number1 = 1

SET @number2 = 867

- Без «RTRIM» возвращается значение 3__!!!

SELECT RIGHT('000' + RTRIM(CAST(@number1 AS NCHAR(3)), 3 )) AS NUMBER_CONVERTED

- Без «RTRIM» возвращается значение 867___!!!

SELECT RIGHT('000000' + RTRIM(CAST(@number2 AS NCHAR(6)), 6 )) AS NUMBER_CONVERTED

0

Использование RIGHT- хороший вариант, но вы также можете сделать следующее:

SUBSTRING(CAST((POWER(10, N) + value) AS NVARCHAR(N + 1)), 2, N)

где N- общее количество цифр, которое вы хотите отобразить. Итак, для трехзначного значения с ведущими нулями ( N = 3):

SUBSTRING(CAST((POWER(10, 3) + value) AS NVARCHAR(4)), 2, 3)

или поочередно

SUBSTRING(CAST(1000 + value) AS NVARCHAR(4)), 2, 3)

При этом желаемое значение прибавляется к степени 10, достаточной для генерации достаточного количества начальных нулей, а затем отсекается начальная 1.

Преимущество этого метода состоит в том, что результат всегда будет одинаковой длины, что позволяет использовать SUBSTRINGвместо вместо RIGHT, что недоступно в некоторых языках запросов (например, HQL).


0

Эта работа для меня в MYSQL:

FUNCTION leadingZero(format VARCHAR(255), num VARCHAR(255))
  RETURNS varchar(255) CHARSET utf8
BEGIN
  return CONCAT(SUBSTRING(format,1,LENGTH(format)-LENGTH(num)),num);
END

Например:

leadingZero('000',999); returns '999'
leadingZero('0000',999); returns '0999'
leadingZero('xxxx',999); returns 'x999'

Надеюсь, это поможет. С уважением


0

Работает в SQLServer

declare @myNumber int = 123
declare @leadingChar varchar(1) = '0'
declare @numberOfLeadingChars int = 5

select right(REPLICATE ( @leadingChar , @numberOfLeadingChars ) + cast(@myNumber as varchar(max)), @numberOfLeadingChars)

наслаждаться


-2

Мне было интересно, будет ли это вам полезно?

declare @val int,@len=800
select replace(str(@val,@len),' ','0')
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.