Yanıtlar:
Aradığın şeyin bu olabileceğine inanıyorum:
SELECT padded_id = REPLACE(STR(id, 4), SPACE(1), '0')
FROM tableA
veya
SELECT REPLACE(STR(id, 4), SPACE(1), '0') AS [padded_id]
FROM tableA
Sözdizimini 2. örnekte test etmedim. Bunun% 100 işe yarayıp yaramadığından emin değilim - biraz ince ayar gerektirebilir - ancak istediğiniz çıktıyı nasıl elde edeceğinize dair genel bir fikir verir.
DÜZENLE
Yorumlarda listelenen endişeleri gidermek için ...
@ pkr298 - Evet STR yalnızca sayılar üzerinde çalışır ... OP'nin alanı bir kimliktir ... dolayısıyla yalnızca sayı.
@Desolator - Elbette bu işe yaramaz ... İlk parametre 6 karakter uzunluğunda. Şunun gibi bir şey yapabilirsiniz:
SELECT REPLACE(STR(id,
(SELECT LEN(MAX(id)) + 4 FROM tableA)), SPACE(1), '0') AS [padded_id] FROM tableA
bu teorik olarak hedef direklerini hareket ettirmelidir ... sayı büyüdükçe HER ZAMAN çalışmalıdır .... 1 veya 123456789 ...
Dolayısıyla, maksimum değeriniz 123456 ise ... 0000123456'yı ve minimum değeriniz 1 ise 0000000001'i görürsünüz.
SQL Server artık 2012 sürümünden itibaren FORMAT işlevini desteklemektedir , bu nedenle:
SELECT FORMAT(id, '0000') FROM TableA
hile yapacak.
Kimliğiniz veya sütununuz varchar
bir içindeyse ve önce dönüştürdüğünüz bir sayıyı temsil ediyorsa:
SELECT FORMAT(CONVERT(INT,id), '0000') FROM TableA
declare @T table(id int)
insert into @T values
(1),
(2),
(12),
(123),
(1234)
select right('0000'+convert(varchar(4), id), 4)
from @T
Sonuç
----
0001
0002
0012
0123
1234
Eski gönderi, ama belki bu birine yardımcı olur:
4 boş olmayan karakterle bitene kadar tamamlamak için:
SELECT RIGHT ('0000'+COLUMNNAME, 4) FROM TABLENAME;
10'a kadar tamamlamak için:
SELECT RIGHT ('0000000000'+COLUMNNAME, 10) FROM TABLENAME;
Sütunun sayısal olması durumunda, önce şu kodla varchar'a dönüştürün:
Select RIGHT('0000'+Convert(nvarchar(20), COLUMNNAME), 4)
From TABLENAME
Ve sayısal alanla 10'a kadar tamamlamak için:
SELECT RIGHT ('0000000000'+Convert(nvarchar(20), COLUMNNAME), 10) FROM TABLENAME;
- Lütfen bunlara bakın.
select FORMAT(1, 'd4');
select FORMAT(2, 'd4');
select FORMAT(12, 'd4');
select FORMAT(123, 'd4');
select FORMAT(1234, 'd4');
- Umarım bunlar sana yardımcı olur
Bu, dizeler, tam sayılar ve sayısallar için çalışır:
SELECT CONCAT(REPLICATE('0', 4 - LEN(id)), id)
4
İstenilen uzunluk nerede . 4 haneden fazla sayılar için çalışır, NULL
değerde boş dizge döndürür .
Hala ilgilenen biri varsa, bu makaleyi DATABASE.GUIDE'da buldum:
SQL Server'da Sol Dolgu - 3 LPAD () Eşdeğeri
Kısaca o yazıda bahsettiğimiz 3 yöntem var.
Diyelim ki id = 12 ve 0012 olarak görüntülenmesi gerekiyor.
Yöntem 1 - RIGHT () İşlevini Kullanma
İlk yöntem, baştaki bazı sıfırları ekledikten sonra dizenin yalnızca en sağdaki bölümünü döndürmek için RIGHT () işlevini kullanır.
SELECT RIGHT('00' + '12', 4);
Sonuç:
0012
Yöntem 2 - RIGHT () ve REPLICATE () Kombinasyonunu Kullanın
Bu yöntem önceki yöntemle hemen hemen aynıdır; tek fark, üç sıfırı REPLICATE () işleviyle değiştirmemdir:
SELECT RIGHT(REPLICATE('0', 2) + '12', 4);
Sonuç:
0012
Yöntem 3 - REPLACE () ve STR () Kombinasyonunu Kullanın
Bu yöntem, önceki yöntemlerden tamamen farklı bir açıdan gelir:
SELECT REPLACE(STR('12', 4),' ','0');
Sonuç:
0012
Makaleye göz atın, örneklerle daha ayrıntılı analizler var.
Buna SQL sunucusunda bir işlevde ihtiyacım vardı ve Patrick'in cevabını biraz ayarladım.
declare @dossierId int = 123
declare @padded_id varchar(7)
set @padded_id = REPLACE(
SPACE(7 - LEN(@dossierId)) + convert(varchar(7), @dossierId),
SPACE(1),
'0')
SELECT @dossierId as '@dossierId'
,SPACE(LEN(@dossierId)) + convert(varchar(7)
,@dossierId) as withSpaces
,@padded_id as '@padded_id'
İşlev Oluştur:
Create FUNCTION [dbo].[PadLeft]
(
@Text NVARCHAR(MAX) ,
@Replace NVARCHAR(MAX) ,
@Len INT
)
RETURNS NVARCHAR(MAX)
AS
BEGIN
DECLARE @var NVARCHAR(MAX)
SELECT @var = ISNULL(LTRIM(RTRIM(@Text)) , '')
RETURN RIGHT(REPLICATE(@Replace,@Len)+ @var, @Len)
END
Misal:
Select dbo.PadLeft('123456','0',8)
SELECT @var = LTRIM(RTRIM(@Text))
Bir işlev oluşturdum:
CREATE FUNCTION [dbo].[fnPadLeft](@int int, @Length tinyint)
RETURNS varchar(255)
AS
BEGIN
DECLARE @strInt varchar(255)
SET @strInt = CAST(@int as varchar(255))
RETURN (REPLICATE('0', (@Length - LEN(@strInt))) + @strInt);
END;
Kullanın: dbo.fnPadLeft (123, 10) seçin
İade: 0000000123
Gerektiğinde oldukça ODBC uyumlu bir şey aşağıdaki olabilir:
select ifnull(repeat('0', 5 - (floor(log10(FIELD_NAME)) + 1)), '')
+ cast (FIELD as varchar(10))
from TABLE_NAME
Bu, 10 tabanlı bir sayı için basamak miktarının günlüğünün integral bileşeni tarafından bulunabileceği gerçeğine dayanır. Bundan, onu istenen dolgu genişliğinden çıkarabiliriz. Tekrar null
1'in altındaki değerler için dönecektir , bu yüzden ihtiyacımız var ifnull
.
Çözümüm verimli değil, ancak değerlerin (banka çek numaraları ve havale referans no.) Bazı girişlerin alfa sayısal değerlere sahip olduğu ve uzunluk 6 karakterden küçükse doldurmak zorunda kaldığım varchar olarak depolandığı durumlarda bana yardımcı oldu.
Birisi aynı durumla karşılaşırsa paylaşmayı düşündüm
declare @minlen int = 6
declare @str varchar(20)
set @str = '123'
select case when len(@str) < @minlen then REPLICATE('0',@minlen-len(@str))+@str else @str end
--Ans: 000123
set @str = '1234'
select case when len(@str) < @minlen then REPLICATE('0',@minlen-len(@str))+@str else @str end
--Ans: 001234
set @str = '123456'
select case when len(@str) < @minlen then REPLICATE('0',@minlen-len(@str))+@str else @str end
--Ans: 123456
set @str = '123456789'
select case when len(@str) < @minlen then REPLICATE('0',@minlen-len(@str))+@str else @str end
--Ans: 123456789
set @str = '123456789'
select case when len(@str) < @minlen then REPLICATE('0',@minlen-len(@str))+@str else @str end
--Ans: 123456789
set @str = 'NEFT 123456789'
select case when len(@str) < @minlen then REPLICATE('0',@minlen-len(@str))+@str else @str end
--Ans: NEFT 123456789
Basit bir örnek olabilir
DECLARE @number INTEGER
DECLARE @length INTEGER
DECLARE @char NVARCHAR(10)
SET @number = 1
SET @length = 5
SET @char = '0'
SELECT FORMAT(@number, replicate(@char, @length))
Bunu yapmak için, istediğiniz çıktı karakter uzunluğunu belirleyebileceğiniz bir işlev oluşturdum:
CREATE FUNCTION [dbo].[udfLeadingZero]
(
@String VARCHAR(MAX)
, @Len INT
)
RETURNS VARCHAR(MAX)
BEGIN
SET @String = RIGHT(REPLICATE('0',@Len)+@String,@Len)
RETURN @String
END
GO