Як перетворити 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

Відповіді:


99

Спробуйте це: 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

56

Ви також можете використовувати функцію 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, ти можеш надати код для цього тесту? Це дуже важливо. Заздалегідь спасибі.
Діомед Домінгес,

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

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

4

Тип даних "int" не може містити більше 10 цифр, крім того, функція "Len ()" працює на ints, тому немає необхідності перетворювати 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 символів, і вам потрібно вводити префікс до провідних 0.


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:

Встановити поле = праворуч (('0000000000' + [Поле]), 10) (Не вдається використовувати формат (), оскільки це попередня версія 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- загальна кількість цифр, яку потрібно відобразити. Отже, для 3-значного значення з початковими нулями ( 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.