Bagaimana cara mengubah int menjadi char dengan nol di depan?

98

Saya perlu mengubah int datafield ke nvarchar dengan angka nol di depan

contoh:

1 ubah menjadi '001'

867 ubah menjadi '000867', dll.

Terima kasih.


Ini tanggapan saya 4 Jam kemudian ...

Saya menguji T-SQL Script ini dan bekerja dengan baik untuk saya!

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

Saya membuat fungsi pengguna ini

Kode 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

Contoh:

PILIH dbo.CIntToChar (867, 6) sebagai COD_ID

KELUARAN

000867

RicardoBalda
sumber
1
Dalam sampel pertama Anda, CAST harus NVARCHAR, bukan jenis NCHAR, karena NCHAR (3) selalu memiliki panjang 3.
nzeemin

Jawaban:

100

Coba ini: select right('00000' + cast(Your_Field as varchar(5)), 5)

Akan didapat hasil dalam 5 digit, misal: 00001, ...., 01234

Nguyen Tran
sumber
1
Perhatikan bahwa untuk postgres Anda harus mengganti + dengan ||, jadiselect right('00000' || cast(Your_Field as varchar(5)), 5)
ronedg
57

Anda juga dapat menggunakan fungsi FORMAT () yang diperkenalkan di 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')
Darek.K
sumber
Saya akan setuju dengan SQL2012, tetapi untuk SQL 2008r2 dan yang lebih lama, solusi saya akan mendapatkan hasilnya
GoldBishop
1
Baru saja menguji FORMAT Sql Server 2012 - itu lambat, seperti dalam "satu nomor per beberapa detik" lambat. Menjauhlah.
Muposat
@Muposat, bisakah anda memberikan kode untuk tes tersebut? Ini sangat penting. Terima kasih sebelumnya.
Diomedes Domínguez
3
@Diomedes Domínguez sudah setahun, jadi saya tidak lagi memiliki tes asli. Saya baru saja menjalankan tes lain di server yang sangat cepat, dan mendapat 32 detik untuk memformat 1 juta angka. Bukan akhir dunia, tetapi solusi yang diposting oleh Nguyen Tran melakukannya dalam 1 detik. Untuk mengujinya, cukup buat loop dari @i int = 0 hingga 10000000.
Muposat
22

Gunakan REPLICATEagar Anda tidak perlu membuat kode keras semua nol di depan:

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

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

KELUARAN:

0000000123
KM.
sumber
13

Bukan untuk High-Jack pertanyaan ini tetapi catatan perlu dibuat bahwa Anda perlu menggunakan (N) VARCHAR daripada (N) CHAR tipe data.

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

Segmen di atas, tidak akan menghasilkan respons yang benar dari SQL 2005

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

Segmen di atas, akan menghasilkan respon yang diinginkan dari SQL 2005

Varchar akan memberi Anda panjang awalan yang diinginkan dengan cepat. Sedangkan untuk tipe data fixed length akan membutuhkan penunjukan dan penyesuaian panjang.

GoldBishop
sumber
6

Saya suka menggunakan

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

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

ini memberi saya

000000004
Sedecimdies
sumber
1
Rasanya agak hacky, tapi berhasil untuk saya di DB2. Saya tidak bisa mendapatkan jawaban di atas untuk bekerja.
Nathan M.
2
Aku juga menyukainya. Jika Panjangnya di-hardcode, Anda bisa menggunakan RIGHT(1000+Number, 3)- bagus, pendek dan cepat
maf-soft
1
Ini berfungsi pada semua varian SQL Server dari tahun 2005 dan seterusnya. Jawaban yang disukai.
Fandango68
1
Apa 10 artinya?
Fandango68
1
@ Fandango68 '10' dalam 'POWER (10, @Length)' di atas adalah karena kami menggunakan aritmatika basis 10 - jadi literal '1000' dalam jawaban maf-soft di atas setara dengan POWER (10, 3) - 10 ^ 3 = 1000.
qxotk
4

Tipe data "int" tidak boleh lebih dari 10 digit, selain itu fungsi "Len ()" bekerja pada int, jadi tidak perlu mengonversi int menjadi string sebelum memanggil fungsi len ().

Terakhir, Anda tidak memperhitungkan kasus di mana ukuran int Anda> jumlah total digit yang Anda inginkan untuk diisi (@intLen).

Oleh karena itu, solusi yang lebih ringkas / tepat adalah:

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
C. Daftar
sumber
3

Tidak terlalu elegan, tetapi saya menambahkan nilai yang ditetapkan dengan angka nol di depan yang sama yang saya inginkan ke angka yang ingin saya ubah, dan menggunakan fungsi KANAN.

Contoh:

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

Hasil: '000867'

Brute Force SQL
sumber
2

Solusi satu baris ( per se ) untuk SQL Server 2008 atau lebih tinggi:

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

Perkalian dengan SIGNekspresi setara dengan MAX(0, @DesiredLenght-LEN([Column])). Masalahnya adalah itu MAX()hanya menerima satu argumen ...

Piotr Nawrot
sumber
1

Saya menemukan artikel bagus di sini :

Mengisi string dengan nol di depan

Saya perlu melakukan ini berkali-kali ketika mengeluarkan ekspor data dengan panjang tetap di mana misalnya kolom numerik sepanjang 9 karakter dan Anda perlu diawali dengan 0 di depan.

Andrew Hare
sumber
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 jika itu adalah kolom int maka masih tidak akan menyimpan nol Lakukan saja di lapisan presentasi atau jika Anda benar-benar perlu di PILIH

Tarun Gupta
sumber
1

Punya masalah yang sama, begini cara saya menyelesaikannya ... Sederhana dan elegan. The "4" adalah berapa panjang string itu, tidak peduli berapa panjang integer yang dilewatkan itu akan pad dengan nol sampai "4".

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

Dalam kasus saya, saya ingin bidang saya memiliki memimpin 0 dalam bidang 10 karakter (NVARCHAR (10)). File sumber tidak memiliki awalan 0 yang diperlukan untuk digabungkan ke dalam tabel lain. Apakah ini hanya karena berada di SQL Server 2008R2:

Setel Bidang = kanan (('0000000000' + [Bidang]), 10) (Tidak dapat menggunakan Format () karena ini adalah pra SQL2012)

Melakukan ini terhadap data yang ada. Jadi cara ini 1 atau 987654321 masih akan mengisi semua 10 spasi dengan 0 di depan.

Saat data baru sedang diimpor & lalu dibuang ke tabel melalui database Access, saya bisa menggunakan Format ([Bidang], "0000000000") saat menambahkan dari Access ke tabel server SQL untuk catatan baru apa pun.

jhimes
sumber
0
DECLARE @number1 INT, @number2 INT

SET @number1 = 1

SET @number2 = 867

- Tanpa 'RTRIM', nilai yang dikembalikan adalah 3__!!!

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

- Tanpa 'RTRIM', nilai yang dikembalikan adalah 867___!!!

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

Menggunakan RIGHTadalah opsi yang bagus, tetapi Anda juga dapat melakukan hal berikut:

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

di mana Njumlah digit yang ingin Anda tampilkan. Jadi untuk nilai 3 digit dengan awalan nol ( N = 3):

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

atau bergantian

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

Apa yang dilakukan ini adalah menambahkan nilai yang diinginkan ke pangkat 10 yang cukup besar untuk menghasilkan cukup banyak angka nol di depan, lalu memotong 1 di depan.

Keuntungan dari teknik ini adalah bahwa panjang hasilnya akan selalu sama, memungkinkan penggunaan SUBSTRINGalih-alih RIGHT, yang tidak tersedia dalam beberapa bahasa kueri (seperti HQL).

Peter Gluck
sumber
0

Ini berfungsi untuk saya di 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

Sebagai contoh:

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

Semoga ini bisa membantu. salam Hormat

Tricky Silence
sumber
0

Bekerja di 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)

Nikmati

Johnny Driesen
sumber
-2

Saya bertanya-tanya, apakah ini ada gunanya bagi Anda?

declare @val int,@len=800
select replace(str(@val,@len),' ','0')
Niren
sumber