İnt'i baştaki sıfırlarla karaktere dönüştürmek nasıl?


99

İnt veri alanını önde gelen sıfırlarla nvarchar'a dönüştürmem gerekiyor

misal:

1 '001' e dönüştür

867, "000867", vb.

Teşekkürler.


Bu benim cevabım 4 saat sonra ...

Bu T-SQL Komut Dosyasını test ettim ve benim için iyi çalışıyor!

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

Bu kullanıcı işlevini yarattım

T-SQL Kodu:

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

Misal :

COD_ID OLARAK dbo.CIntToChar (867, 6) SEÇİN

ÇIKTI

000867

Yanıtlar:


100

Bunu dene: select right('00000' + cast(Your_Field as varchar(5)), 5)

Sonucu 5 basamaklı olarak alır, örn: 00001, ...., 01234



22

Kullanım REPLICATEsabit kod tüm önde gelen sıfırlar zorunda kalmamak için:

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

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

ÇIKTI:

0000000123

13

Bu soruyu High-Jack için değil, ancak (N) CHAR veri türü yerine (N) VARCHAR kullanmanız gerektiğini not etmeniz gerekiyor.

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

Yukarıdaki segment, SQL 2005'ten doğru yanıtı üretmeyecek

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

Yukarıdaki segment, SQL 2005'ten istenen yanıtı üretecektir.

Varchar size anında istediğiniz önek uzunluğunu sağlayacaktır. Sabit uzunlukta veri türünün uzunluk belirtme ve ayarlamalar gerektireceği yer.


6

Kullanmayı severim

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

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

bu bana verir

000000004

4

"İnt" veri türü 10 haneden fazla olamaz, ayrıca "Len ()" işlevi ints üzerinde çalışır, bu nedenle len () işlevini çağırmadan önce int'i bir dizeye dönüştürmeye gerek yoktur.

Son olarak, int'inizin boyutunun> doldurulmasını istediğiniz toplam basamak sayısının (@intLen) olduğu durumu dikkate almıyorsunuz.

Bu nedenle, daha özlü / doğru bir çözüm:

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

Çok zarif değil, ama dönüştürmek istediğim sayısal değere aynı sayıda önde gelen sıfırla bir set değeri ekliyorum ve SAĞ işlevini kullanıyorum.

Misal:

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

Sonuç: '000867'


2

SQL Server 2008 veya üzeri için tek satırlık çözüm ( kendi başına ):

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

SIGNİfade ile çarpma işlemine eşdeğerdir MAX(0, @DesiredLenght-LEN([Column])). Sorun şu ki MAX(), sadece bir argümanı kabul ediyor ...


1

Burada güzel bir makale buldum :

Bir dizeyi baştaki sıfırlarla doldurma

Bunu, örneğin bir sayısal sütunun 9 karakter uzunluğunda olduğu ve baştaki 0'ların önüne koymanız gereken sabit uzunlukta bir veri aktarımı çıktısını verirken bunu birçok kez yapmam gerekiyor.


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)

BTW eğer bir int sütunu ise o zaman yine de sıfırları tutmayacaktır Sadece sunum katmanında yapın veya SELECT'te gerçekten ihtiyacınız varsa


1

Aynı sorun vardı, ben de böyle çözdüm ... Basit ve zarif. "4", dizenin ne kadar uzun olması gerektiğidir, hangi uzunlukta tamsayı geçirilirse geçirilsin, "4" e kadar sıfırlarla doldurur.

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

1

Benim durumumda, alanımın 10 karakter alanında 0'ın başında olmasını istedim (NVARCHAR (10)). Kaynak dosyada, daha sonra başka bir tabloda birleştirilmesi gereken baştaki 0'lar yok. Bunu sadece SQL Server 2008R2'de olduğu için mi yaptı:

Set Field = right (('0000000000' + [Field]), 10) (Format () kullanılamaz, çünkü bu SQL2012 öncesi)

Bunu mevcut verilere karşı gerçekleştirdi. Yani bu şekilde 1 veya 987654321, 10 boşluğun tamamını baştaki 0'larla dolduracaktır.

Yeni veriler içe aktarılırken ve daha sonra bir Access veritabanı aracılığıyla tabloya dökülürken, herhangi bir yeni kayıt için Access'ten SQL sunucu tablosuna eklerken Biçim ([Alan], "0000000000") kullanabiliyorum.


0
DECLARE @number1 INT, @number2 INT

SET @number1 = 1

SET @number2 = 867

- 'RTRIM' olmadan döndürülen değer 3__!!!

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

- 'RTRIM' olmadan döndürülen değer 867___!!!

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

0

Kullanmak RIGHTiyi bir seçenektir ancak aşağıdakileri de yapabilirsiniz:

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

Ngörüntülenmesini istediğiniz toplam basamak sayısı nerede . Yani başında sıfır olan 3 basamaklı bir değer için ( N = 3):

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

veya dönüşümlü olarak

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

Bunun yaptığı şey, yeterli sayıda önde sıfır oluşturmaya yetecek kadar büyük bir 10 gücüne istenen değeri eklemek ve ardından baştaki 1'i kesmek.

Bu tekniğin avantajı, sonucun her zaman aynı uzunlukta olması ve bazı sorgu dillerinde (HQL gibi) bulunmayan SUBSTRINGyerine kullanımına izin RIGHTvermesidir.


0

Bu benim için MYSQL'de çalışıyor:

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

Örneğin:

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

Umarım bu yardımcı olur. Saygılarımla


0

SQLServer'da çalışır

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

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

Zevk almak


-2

Merak ediyordum, bunun senin için bir faydası olur mu?

declare @val int,@len=800
select replace(str(@val,@len),' ','0')
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.