Aku punya string yang sampai 3 karakter lama ketika itu's pertama kali dibuat di SQL Server 2008 R2.
Saya ingin pad dengan angka nol di depan, jadi jika nilai aslinya adalah '1' kemudian nilai baru akan '001'. Atau jika nilai aslinya adalah '23' baru nilai '023'. Atau jika nilai aslinya adalah '124' maka nilai baru adalah sama dengan nilai asli.
Saya menggunakan SQL Server 2008 R2. Bagaimana saya melakukan ini dengan menggunakan T-SQL?
Jika lapangan sudah string, ini akan bekerja
SELECT RIGHT('000'+ISNULL(field,''),3)
Jika anda ingin nulls untuk menunjukkan sebagai '000'
Mungkin integer-maka anda akan ingin
SELECT RIGHT('000'+CAST(field AS VARCHAR(3)),3)
Seperti yang dipersyaratkan oleh pertanyaan jawaban ini hanya bekerja jika panjang <= 3, jika anda ingin sesuatu yang lebih besar yang anda butuhkan untuk mengubah string konstan dan dua konstanta integer dengan lebar yang dibutuhkan. misalnya
'0000' dan VARCHAR(4)),4
Meskipun pertanyaan itu untuk SQL Server 2008 R2, dalam kasus seseorang yang membaca ini dengan versi 2012 dan di atas, sejak itu menjadi jauh lebih mudah dengan menggunakan FORMAT.
Anda dapat melewati standar format numerik string atau custom format numerik string sebagai argumen format (terima kasih Vadim Ovchinnikov untuk petunjuk ini).
Untuk pertanyaan ini untuk contoh kode seperti
DECLARE @myInt INT = 1;
-- One way using a standard numeric format string
PRINT FORMAT(@myInt,'D3');
-- Other way using a custom numeric format string
PRINT FORMAT(@myInt,'00#');
output
001
001
Aman metode:
SELECT REPLACE(STR(n,3),' ','0')
Ini memiliki keuntungan dari kembali string'***'
untuk n < 0 atau n > 999, yang lebih bagus dan jelas indikator out-of-batas input. Metode lain yang tercantum di sini akan gagal diam-diam dengan membatasi masukan ke 3-karakter substring.
Berikut ini's yang lebih umum teknik untuk left-padding untuk apapun yang diinginkan, lebar:
declare @x int = 123 -- value to be padded
declare @width int = 25 -- desired width
declare @pad char(1) = '0' -- pad character
select right_justified = replicate(
@pad ,
@width-len(convert(varchar(100),@x))
)
+ convert(varchar(100),@x)
Namun, jika anda're berurusan dengan nilai-nilai negatif, dan padding dengan awalan nol, baik ini, maupun yang lain menyarankan teknik ini akan bekerja. Anda'll mendapatkan sesuatu yang terlihat seperti ini:
00-123
[Mungkin bukan apa yang anda inginkan]
Jadi … anda'll harus melompat melalui beberapa tambahan hoops di Sini's salah satu pendekatan yang benar akan format angka negatif:
declare @x float = -1.234
declare @width int = 20
declare @pad char(1) = '0'
select right_justified = stuff(
convert(varchar(99),@x) , -- source string (converted from numeric value)
case when @x < 0 then 2 else 1 end , -- insert position
0 , -- count of characters to remove from source string
replicate(@pad,@width-len(convert(varchar(99),@x)) ) -- text to be inserted
)
Salah satu yang harus dicatat bahwa convert()
panggilan harus menentukan sebuah [n]varchar
cukup panjang untuk menampung hasil dikonversi dengan pemotongan.
Berikut adalah varian dari Hogan's jawaban yang saya gunakan dalam SQL Server Express 2012:
SELECT RIGHT(CONCAT('000', field), 3)
Alih-alih khawatir jika lapangan adalah string atau tidak, saya hanya CONCAT
itu, sejak itu'll output string pula. Selain itu jika lapangan dapat menjadi NULL
, menggunakan ISNULL
mungkin diperlukan untuk menghindari fungsi mendapatkan NULL
hasil.
SELECT RIGHT(CONCAT('000', ISNULL(field,'')), 3)
Gunakan fungsi ini yang sesuai dengan setiap situasi.
CREATE FUNCTION dbo.fnNumPadLeft (@input INT, @pad tinyint)
RETURNS VARCHAR(250)
AS BEGIN
DECLARE @NumStr VARCHAR(250)
SET @NumStr = LTRIM(@input)
IF(@pad > LEN(@NumStr))
SET @NumStr = REPLICATE('0', @Pad - LEN(@NumStr)) + @NumStr;
RETURN @NumStr;
END
Contoh output
SELECT [dbo].[fnNumPadLeft] (2016,10) -- returns 0000002016
SELECT [dbo].[fnNumPadLeft] (2016,5) -- returns 02016
SELECT [dbo].[fnNumPadLeft] (2016,2) -- returns 2016
SELECT [dbo].[fnNumPadLeft] (2016,0) -- returns 2016
Aku tahu tua tiket saya hanya berpikir untuk berbagi.
Saya menemukan kode ini mencari solusi. Tidak yakin apakah itu bekerja pada semua versi MSSQL saya telah MSSQL 2016.
declare @value as nvarchar(50) = 23
select REPLACE(STR(CAST(@value AS INT) + 1,4), SPACE(1), '0') as Leadingzero
kembali "0023" 4 di STR fungsi adalah panjang total termasuk nilai. Contoh 4, 23 dan 123 semua akan memiliki 4 di STR dan jumlah yang benar dari nol akan ditambahkan. Anda dapat menambah atau mengurangi itu. Tidak perlu untuk mendapatkan panjang pada 23.
Edit: saya melihat sama seperti @Anon posting.
Aku punya masalah yang sama dengan integer kolom sebagai input ketika saya membutuhkan berukuran tetap varchar (atau string) output. Misalnya, 1 untuk '01', 12 untuk '12'. Kode ini bekerja:
SELECT RIGHT(CONCAT('00',field::text),2)
Jika input juga kolom varchar, anda dapat menghindari casting bagian.
Menulis ini karena saya memiliki kebutuhan untuk sampai panjang tertentu (9). Bantalan kiri dengan @pola HANYA ketika input kebutuhan padding. Harus selalu kembali suhu udara yang didefinisikan di @pola.
declare @charInput as char(50) = 'input'
--always handle NULL :)
set @charInput = isnull(@charInput,'')
declare @actualLength as int = len(@charInput)
declare @pattern as char(50) = '123456789'
declare @prefLength as int = len(@pattern)
if @prefLength > @actualLength
select Left(Left(@pattern, @prefLength-@actualLength) + @charInput, @prefLength)
else
select @charInput
Kembali 1234input
Sederhana adalah bahwa
Seperti:
DECLARE @DUENO BIGINT
SET @DUENO=5
SELECT 'ND'+STUFF('000000',6-LEN(RTRIM(@DueNo))+1,LEN(RTRIM(@DueNo)),RTRIM(@DueNo)) DUENO
Ini saya buat fungsi yang melayani untuk bigint dan satu nol atau satu karakter (max 20 karakter kembali) dan memungkinkan untuk panjang hasil kurang dari panjang input nomor:
create FUNCTION fnPadNum (
@Num BIGINT --Number to be padded, @sLen BIGINT --Total length of results , @PadChar varchar(1))
RETURNS VARCHAR(20)
AS
--Pads bigint with leading 0's
--Sample: "select dbo.fnPadNum(201,5,'0')" returns "00201"
--Sample: "select dbo.fnPadNum(201,5,'*')" returns "**201"
--Sample: "select dbo.fnPadNum(201,5,' ')" returns " 201"
BEGIN
DECLARE @Results VARCHAR(20)
SELECT @Results = CASE
WHEN @sLen >= len(ISNULL(@Num, 0))
THEN replicate(@PadChar, @sLen - len(@Num)) + CAST(ISNULL(@Num, 0) AS VARCHAR)
ELSE CAST(ISNULL(@Num, 0) AS VARCHAR)
END
RETURN @Results
END
GO
--Usage:
SELECT dbo.fnPadNum(201, 5,'0')
SELECT dbo.fnPadNum(201, 5,'*')
SELECT dbo.fnPadNum(201, 5,' ')