it-swarm.com.de

Füllen Sie eine Zeichenfolge mit führenden Nullen auf, sodass sie in SQL Server 2008 aus 3 Zeichen besteht

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?

301
Sunil

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

540
Hogan

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
101
Géza

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.

77
Anon

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.

28
Nicholas Carey

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)
22
jahu

Ich habe die folgende Methode immer als sehr hilfreich empfunden.

REPLICATE('0', 5 - LEN(Job.Number)) + CAST(Job.Number AS varchar) as 'NumberFull'
15
Bill

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 
11
Salar

Für diejenigen, die ihre vorhandenen Daten aktualisieren möchten, ist hier die Abfrage:

update SomeEventTable set eventTime=RIGHT('00000'+ISNULL(eventTime, ''),5)
5
Alan B. Dee

Für Ganzzahlen können Sie die implizite Konvertierung von int in varchar verwenden:

SELECT RIGHT(1000 + field, 3)
3
Konstantin

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. 

1
user3183867

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

1
nicky

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
1
DEBASIS PAUL

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.

1
Niel Buys

Versuchen Sie dies mit fester Länge.

select right('000000'+'123',5)

select REPLICATE('0', 5 - LEN(123)) + '123'
0
Dr.Stark

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)
0
ncastillo