550 Stimmen

Füllen Sie einen String mit führenden Nullen auf, sodass er in SQL Server 2008 3 Zeichen lang ist

Ich habe eine Zeichenfolge, die beim ersten Erstellen in SQL Server 2008 R2 bis zu 3 Zeichen lang ist.

Ich möchte sie mit führenden Nullen auffüllen, damit der neue Wert beispielsweise '001' ist, wenn der ursprüngliche Wert '1' war. Oder wenn der ursprüngliche Wert '23' war, ist der neue Wert '023'. Oder wenn der ursprüngliche Wert '124' war, bleibt der neue Wert gleich wie der ursprüngliche Wert.

Ich verwende SQL Server 2008 R2. Wie würde ich das mit T-SQL machen?

889voto

Hogan Punkte 65759

Wenn das Feld bereits ein String ist, funktioniert dies

 SELECT RIGHT('000'+COALESCE(field,''),3)

Wenn Sie möchten, dass Nullen als '000' angezeigt werden

Es könnte sich um eine Ganzzahl handeln - dann möchten Sie wahrscheinlich

 SELECT RIGHT('000'+CAST(field AS VARCHAR(3)),3)

Wie von der Frage gefordert, funktioniert diese Antwort nur, wenn die Länge <= 3 beträgt. Wenn Sie etwas Größeres möchten, müssen Sie die Stringkonstante und die beiden Integerkonstanten auf die erforderliche Breite ändern. zB '0000' und VARCHAR(4)),4

212voto

Géza Punkte 2192

Auch wenn die Frage für SQL Server 2008 R2 gestellt wurde, falls jemand dies mit Version 2012 und höher liest, ist es seitdem viel einfacher geworden durch die Verwendung von FORMAT.

Sie können entweder eine Standardnummer-Formatzeichenfolge oder eine benutzerdefinierte numerische Formatzeichenfolge als das Formatargument übergeben (Dank an Vadim Ovchinnikov für diesen Hinweis).

Für diese Frage zum Beispiel ein Code wie

DECLARE @myInt INT = 1;
-- Ein Weg mit einer Standardnumerischen Formatzeichenfolge
PRINT FORMAT(@myInt,'D3');
-- Ein anderer Weg mit einer benutzerdefinierten numerischen Formatzeichenfolge
PRINT FORMAT(@myInt,'00#');

gibt aus

001
001

180voto

Anon Punkte 10144

Die sichere Methode:

SELECT REPLACE(STR(n,3),' ','0')

Dies hat den Vorteil, dass der String '***' für n < 0 oder n > 999 zurückgegeben wird, was ein deutlicher Hinweis auf eine außerhalb des gültigen Bereichs liegende Eingabe ist. Die anderen hier aufgelisteten Methoden werden stillschweigend versagen, indem sie die Eingabe auf einen 3-Zeichen-Teilstring verkürzen.

49voto

jahu Punkte 5137

Hier ist eine Variante von Hogans Antwort, die ich in SQL Server Express 2012 verwende:

SELECT RIGHT(CONCAT('000', field), 3)

Anstatt sich Sorgen zu machen, ob das Feld eine Zeichenfolge ist oder nicht, verwende ich einfach CONCAT, da es sowieso eine Zeichenfolge ausgeben wird. Zusätzlich, wenn das Feld ein NULL sein kann, ist es möglicherweise erforderlich, ISNULL zu verwenden, um zu verhindern, dass die Funktion NULL-Ergebnisse erhält.

SELECT RIGHT(CONCAT('000', ISNULL(field,'')), 3)

35voto

Nicholas Carey Punkte 64738

Hier ist eine allgemeinere Technik zum Links-Padding auf eine beliebige Breite:

declare @x     int     = 123 -- Wert, der aufgepolstert werden soll
declare @width int     = 25  -- gewünschte Breite
declare @pad   char(1) = '0' -- Aufpolsterzeichen

select right_justified = COALESCE(replicate(
                           @pad ,
                           @width-len(convert(varchar(100),@x))
                           ), '')
                       + convert(varchar(100),@x)

Wenn Sie jedoch mit negativen Werten arbeiten und mit führenden Nullen aufpolstern, wird weder diese noch eine andere vorgeschlagene Technik funktionieren. Sie erhalten etwas, das so aussieht:

00-123

[Wahrscheinlich nicht das, was Sie wollten]

Also ... Sie müssen einige zusätzliche Hürden nehmen. Hier ist ein Ansatz, der negative Zahlen korrekt formatiert:

declare @x     float   = -1.234
declare @width int     = 20
declare @pad   char(1) = '0'

select right_justified = stuff(
         convert(varchar(99),@x) ,                            -- Quellzeichenfolge (konvertiert aus numerischem Wert)
         case when @x < 0 then 2 else 1 end ,                 -- Einfügeposition
         0 ,                                                  -- Anzahl der Zeichen, die aus der Quellzeichenfolge entfernt werden sollen
         replicate(@pad,@width-len(convert(varchar(99),@x)) ) -- einzufügender Text
         )

Man sollte beachten, dass die convert()-Aufrufe eine ausreichende Länge für ein [n]varchar angeben sollten, um das konvertierte Ergebnis mit Abschneidung aufzunehmen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X