Ich habe eine Zeichenfolge, die bis zu 3 Zeichen lang ist, wenn sie erstmals in SQL Server 2008 R2 erstellt wird.
Ich möchte es mit führenden Nullen auffüllen. Wenn der ursprüngliche Wert '1' war, wäre der neue Wert '001'. Wenn der ursprüngliche Wert "23" war, lautet der neue Wert "023". Wenn der ursprüngliche Wert "124" ist, entspricht der neue Wert dem ursprünglichen Wert.
Ich verwende SQL Server 2008 R2. Wie mache ich das mit T-SQL?
Wenn das Feld bereits eine Zeichenfolge ist, funktioniert dies
SELECT RIGHT('000'+ISNULL(field,''),3)
Wenn Sie möchten, dass Nullen als "000" angezeigt werden
Es könnte eine ganze Zahl sein - dann möchten Sie
SELECT RIGHT('000'+CAST(field AS VARCHAR(3)),3)
Wie von der Frage gefordert, funktioniert diese Antwort nur, wenn die Länge <= 3 ist. Wenn Sie etwas Größeres wünschen, müssen Sie die Zeichenfolgekonstante und die beiden Ganzzahlkonstanten auf die erforderliche Breite ändern. zB
'0000' and VARCHAR(4)),4
Die Frage war zwar für SQL Server 2008 R2. Falls jemand dies mit Version 2012 und höher liest, wurde es seitdem durch die Verwendung von FORMAT viel einfacher.
Als Formatargument können Sie entweder eine numerische Standard-Formatzeichenfolge oder eine benutzerdefinierte numerische Formatzeichenfolge übergeben (danke Vadim Ovchinnikov für diesen Hinweis).
Für diese Frage zum Beispiel einen Code wie
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#');
ausgänge
001
001
Die sichere Methode:
SELECT REPLACE(STR(n,3),' ','0')
Dies hat den Vorteil, dass die Zeichenfolge '***'
für n <0 oder n> 999 zurückgegeben wird, was ein netter und offensichtlicher Indikator für die Eingabe außerhalb des zulässigen Bereichs ist. Die anderen hier aufgelisteten Methoden schlagen fehl, indem sie die Eingabe auf eine aus 3 Zeichen bestehende Teilzeichenfolge kürzen.
Hier ist eine allgemeinere Technik für das Auffüllen mit Links auf jede gewünschte Breite:
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)
Wenn Sie jedoch mit negativen Werten arbeiten und mit führenden Nullen auffüllen, funktionieren weder diese noch die vorgeschlagene Technik. Sie erhalten etwas, das so aussieht:
00-123
[Wahrscheinlich nicht was Sie wollten]
Also… Sie müssen einige zusätzliche Reifen durchgehen. Hier ist ein Ansatz, der negative Zahlen richtig formatiert:
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
)
Es sollte beachtet werden, dass die Aufrufe von convert()
einen [n]varchar
angeben sollten, der ausreicht, um das konvertierte Ergebnis mit einer Kürzung zu speichern.
Hier ist eine Variante der Antwort von Hogan, die ich in SQL Server Express 2012 verwende:
SELECT RIGHT(CONCAT('000', field), 3)
Anstatt mir Sorgen zu machen, ob das Feld eine Zeichenfolge ist oder nicht, CONCAT
, da es sowieso eine Zeichenfolge ausgibt. Wenn das Feld auch eine NULL
sein kann, ist möglicherweise die Verwendung von ISNULL
erforderlich, um zu verhindern, dass die Funktion NULL
-Ergebnisse erhält.
SELECT RIGHT(CONCAT('000', ISNULL(field,'')), 3)
Ich habe die folgende Methode immer als sehr hilfreich empfunden.
REPLICATE('0', 5 - LEN(Job.Number)) + CAST(Job.Number AS varchar) as 'NumberFull'
Verwenden Sie diese Funktion für jede Situation.
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
Beispielausgabe
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
Für diejenigen, die ihre vorhandenen Daten aktualisieren möchten, ist hier die Abfrage:
update SomeEventTable set eventTime=RIGHT('00000'+ISNULL(eventTime, ''),5)
Für Ganzzahlen können Sie die implizite Konvertierung von int in varchar verwenden:
SELECT RIGHT(1000 + field, 3)
Ich hatte ein ähnliches Problem mit der ganzzahligen Spalte als Eingabe, wenn ich eine Ausgabe mit fester Größe (oder Zeichenfolge) benötigte. Zum Beispiel 1 bis '01', 12 bis '12'. Dieser Code funktioniert:
SELECT RIGHT(CONCAT('00',field::text),2)
Wenn die Eingabe auch eine Spalte von Varchar ist, können Sie den Gussteil vermeiden.
Ich habe dies geschrieben, weil ich Anforderungen für eine bestimmte Länge (9) hatte Füllt die linke Seite NUR mit dem @pattern auf, wenn die Eingabe aufgefüllt werden muss.
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, @[email protected]) + @charInput, @prefLength)
else
select @charInput
Gibt 1234 Eingabe zurück
Einfach ist das
Mögen:
DECLARE @DUENO BIGINT
SET @DUENO=5
SELECT 'ND'+STUFF('000000',6-LEN(RTRIM(@DueNo))+1,LEN(RTRIM(@DueNo)),RTRIM(@DueNo)) DUENO
Ich kenne das alte Ticket, von dem ich dachte, es zu teilen.
Ich fand diesen Code auf der Suche nach einer Lösung. Nicht sicher, ob es auf allen Versionen von MSSQL funktioniert. Ich habe MSSQL 2016.
declare @value as nvarchar(50) = 23
select REPLACE(STR(CAST(@value AS INT) + 1,4), SPACE(1), '0') as Leadingzero
gibt "0023" .__ zurück. Die 4 in der Funktion STR gibt die Gesamtlänge einschließlich des Werts an. Die Beispiele 4, 23 und 123 haben alle 4 in STR und die korrekte Anzahl von Nullen wird hinzugefügt. Sie können es erhöhen oder verringern. Keine Notwendigkeit, die Länge auf der 23 zu bekommen.
Edit: Ich sehe es genauso wie @Anon post.
Versuchen Sie dies mit fester Länge.
select right('000000'+'123',5)
select REPLICATE('0', 5 - LEN(123)) + '123'
Für einen dynamischeren Ansatz versuchen Sie dies.
declare @val varchar(5)
declare @maxSpaces int
set @maxSpaces = 3
set @val = '3'
select concat(REPLICATE('0',@maxSpaces-len(@val)),@val)