PadLeft-Funktion in T-SQL

113

Ich habe die folgende Tabelle A:

id
----
1
2
12
123
1234

Ich muss die idWerte mit Nullen auffüllen:

id
----
0001
0002
0012
0123
1234

Wie kann ich das erreichen?

Gali
quelle

Antworten:

197

Ich glaube, das ist vielleicht das, wonach Sie suchen:

SELECT padded_id = REPLACE(STR(id, 4), SPACE(1), '0') 

FROM tableA

oder

SELECT REPLACE(STR(id, 4), SPACE(1), '0') AS [padded_id]

FROM tableA

Ich habe die Syntax im zweiten Beispiel nicht getestet. Ich bin mir nicht sicher, ob dies zu 100% funktioniert - möglicherweise sind einige Anpassungen erforderlich -, aber es vermittelt die allgemeine Vorstellung, wie Sie die gewünschte Ausgabe erhalten.

BEARBEITEN

Um die in den Kommentaren aufgeführten Bedenken auszuräumen ...

@ pkr298 - Ja STR funktioniert nur mit Zahlen ... Das Feld des OP ist eine ID ... daher nur mit Zahlen.

@Desolator - Das funktioniert natürlich nicht ... der erste Parameter ist 6 Zeichen lang. Sie können so etwas tun wie:

SELECT REPLACE(STR(id,
(SELECT LEN(MAX(id)) + 4 FROM tableA)), SPACE(1), '0') AS [padded_id] FROM tableA

Dies sollte theoretisch die Torpfosten verschieben ... wenn die Zahl größer wird, sollte es IMMER funktionieren ... unabhängig davon, ob es 1 oder 123456789 ist ...

Wenn Ihr Maximalwert also 123456 ist ... würden Sie 0000123456 sehen und wenn Ihr Minimalwert 1 ist, würden Sie 0000000001 sehen

Patrick
quelle
4
STR () funktioniert nur mit Zahlen (oder Zahlen in Zeichenfolgenfeldern). Dieser Code wird unterbrochen, wenn Sie ihn in einem Varchar-Feld verwenden, von dem Sie annehmen, dass es eine Nummer hat, aber einer der Datensätze fehlerhafte (nicht numerische) Daten enthält. Die Funktion RIGHT () wird in diesem Fall nicht unterbrochen.
pkr298
1
Die Funktion STR () funktioniert nicht, wenn die Nummer STR(123456, 4)****
2
@Desolator Ich habe eine Antwort und einen Fix hinzugefügt, um das von Ihnen hinzugefügte Szenario zu vereinfachen.
Patrick
66

SQL Server unterstützt jetzt die FORMAT- Funktion ab Version 2012, also:

SELECT FORMAT(id, '0000') FROM TableA

wird den Trick machen.

Wenn sich Ihre ID oder Spalte in a befindet varcharund eine Zahl darstellt, die Sie zuerst konvertieren:

SELECT FORMAT(CONVERT(INT,id), '0000') FROM TableA
CrimsonKing
quelle
Glatt und einfach, danke! Angesichts des Datums der ursprünglichen Frage sollte dies nun die offizielle Antwort sein;)
David Gunderson
1
Wenn id eine Zeichenfolge ist, können Sie sie zuerst in eine Ganzzahl konvertieren - wählen Sie das Format (konvertieren (int, id), '0000')
CrimsonKing
Entschuldigung, aber ich stimme ab, weil dieser Weg WIRKLICH langsam ist. Es dauerte vier ganze Sekunden, um über 90 Zeilen zu laufen, während die akzeptierte Antwort sofort erfolgte. Dies ist ein sehr großer Nachteil, und das FORMAT sollte nur für ein oder zwei Datensätze verwendet werden, max. Ansonsten ist es wegen seiner sehr schlechten Leistung nutzlos.
Schatten-Assistent ist Ohr für Sie
@ShadowWizard Ich sehe eine sofortige Leistung mit FORMAT mit Tausenden von Zeilen.
JohnnyHK
@JohnnyHK na ja, vielleicht etwas mit dem Tischdesign oder anderen DB-Macken, aber trotzdem ... Tatsache ist, dass es für mich sehr langsam war, während der andere Weg schnell war.
Schatten-Assistent ist Ohr für Sie
60
declare @T table(id int)
insert into @T values
(1),
(2),
(12),
(123),
(1234)

select right('0000'+convert(varchar(4), id), 4)
from @T

Ergebnis

----
0001
0002
0012
0123
1234
Mikael Eriksson
quelle
43

Alter Beitrag, aber vielleicht hilft das jemandem:

So vervollständigen Sie, bis 4 nicht leere Zeichen angezeigt werden:

SELECT RIGHT ('0000'+COLUMNNAME, 4) FROM TABLENAME;

Bis 10 abschließen:

SELECT RIGHT ('0000000000'+COLUMNNAME, 10) FROM TABLENAME;

Wenn die Spalte numerisch ist , konvertieren Sie sie zuerst mit folgendem Code in varchar:

Select RIGHT('0000'+Convert(nvarchar(20), COLUMNNAME), 4)
From TABLENAME

Und um bis 10 mit einem numerischen Feld zu vervollständigen:

SELECT RIGHT ('0000000000'+Convert(nvarchar(20), COLUMNNAME), 10) FROM TABLENAME;
Marcelo Myara
quelle
1
@ SilverM-A, es gibt kein Dienstprogramm zum Hinzufügen von Nullen vor einer Zahl, da diese sowieso ignoriert werden (0003 ist schließlich 3). Wahrscheinlich möchten Sie diese Zahl in eine Zeichenfolge (varchar) umwandeln und dann die obige Anweisung verwenden.
Marcelo Myara
1
@ SilverM-A, wenn dies der Fall ist, wandeln Sie es einfach mit dem Befehl "CAST" wie folgt um: SELECT RIGHT ('0000000000' + CAST (COLUMNNAME AS VARCHAR), 10) FROM TABLENAME; Ist es das?
Marcelo Myara
@MarceloMyara Dies sollte Teil der Antwort sein, nicht nur ein Kommentar. Fügte jetzt mich hinzu.
Schatten-Assistent ist Ohr für Sie
Hinweis: Dies ist die effizienteste Antwort, ohne ausgefallene Funktionen, die sehr langsam werden könnten. Daher habe ich es extra Kopfgeld gegeben.
Schatten-Assistent ist Ohr für Sie
12

Versuche dies:

SELECT RIGHT(REPLICATE('0',4)+CAST(Id AS VARCHAR(4)),4) FROM [Table A]
Aporia
quelle
8

- Bitte schauen Sie sich diese an.

select FORMAT(1, 'd4');
select FORMAT(2, 'd4');
select FORMAT(12, 'd4');
select FORMAT(123, 'd4');
select FORMAT(1234, 'd4');

- Ich hoffe, diese würden Ihnen helfen

Mr. Wimol Prommajorm
quelle
1
Verfügbar seit SQL Server 2012: msdn.microsoft.com/en-us/library/hh213505.aspx
Styxxy
5

Dies funktioniert für Zeichenfolgen, Ganzzahlen und Zahlen:

SELECT CONCAT(REPLICATE('0', 4 - LEN(id)), id)

Wo 4ist die gewünschte Länge. Funktioniert für Zahlen mit mehr als 4 Ziffern und gibt eine leere Zeichenfolge für den NULLWert zurück.

Piotr Nawrot
quelle
3

Wenn noch jemand interessiert ist, habe ich diesen Artikel auf DATABASE.GUIDE gefunden:
Left Padding in SQL Server - 3 LPAD () -Äquivalenten

Kurz gesagt, in diesem Artikel werden drei Methoden erwähnt.
Angenommen, Ihre ID ist = 12 und muss als 0012 angezeigt werden.

Methode 1 - Verwenden der Funktion RIGHT ()
Die erste Methode verwendet die Funktion RIGHT (), um nach dem Hinzufügen einiger führender Nullen nur den am weitesten rechts stehenden Teil der Zeichenfolge zurückzugeben.

SELECT RIGHT('00' + '12', 4);

Ergebnis:
0012

Methode 2 - Verwenden Sie eine Kombination aus RIGHT () und REPLICATE ().
Diese Methode ist fast dieselbe wie die vorherige Methode. Der einzige Unterschied besteht darin, dass ich die drei Nullen einfach durch die Funktion REPLICATE () ersetze:

SELECT RIGHT(REPLICATE('0', 2) + '12', 4);

Ergebnis:
0012

Methode 3 - Verwenden Sie eine Kombination aus REPLACE () und STR ().
Diese Methode hat einen völlig anderen Blickwinkel als die vorherigen Methoden:

SELECT REPLACE(STR('12', 4),' ','0');

Ergebnis:
0012

Schauen Sie sich den Artikel an, es gibt eine eingehendere Analyse mit Beispielen.

kfed
quelle
2

Dies ist, was ich normalerweise verwende, wenn ich einen Wert auffüllen muss.

SET @PaddedValue = REPLICATE('0', @Length - LEN(@OrigValue)) + CAST(@OrigValue as VARCHAR)
KenB
quelle
1

Ich brauchte dies in einer Funktion auf SQL Server und passte Patricks Antwort ein wenig an.

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'
Bob Lokerse
quelle
1

Funktion erstellen:

    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

Beispiel:

Select dbo.PadLeft('123456','0',8)
mehrdad
quelle
Nur ein Punkt zu Standards, ich würde mich nicht mit der IsNull-Prüfung beschäftigen. Wenn der Wert null ist, sollte die Funktion für diesen Wert immer noch null zurückgeben, da dies das Standardverhalten für die integrierten Funktionen ist. Wenn wir alles in einen Wert ungleich Null konvertieren, kann der Aufrufer keine logischen Nulloperationen mehr verwenden, die er sonst möglicherweise erwartet. (Null in vielen meiner Tabellen bedeutet "nicht angegeben" und ein Standardwert sollte verwendet werden.SELECT @var = LTRIM(RTRIM(@Text))
Chris Schaller
1

Ich habe eine Funktion erstellt:

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;

Verwendung: Wählen Sie dbo.fnPadLeft (123, 10).

Rückgabe: 0000000123

Anne Lord
quelle
0

Bei Bedarf kann Folgendes ziemlich ODBC-konform sein:

select ifnull(repeat('0', 5 - (floor(log10(FIELD_NAME)) + 1)), '')
        + cast (FIELD as varchar(10))
  from TABLE_NAME

Dies basiert auf der Tatsache, dass die Anzahl der Ziffern für eine Basis-10-Zahl durch die integrale Komponente ihres Protokolls ermittelt werden kann. Davon können wir es von der gewünschten Polsterbreite abziehen. Wiederholen wird nullfür Werte unter 1 zurückgegeben, also brauchen wir ifnull.

Brett Ryan
quelle
0

Meine Lösung ist nicht effizient, hat mir aber in Situationen geholfen, in denen die Werte (Bankschecknummern und Überweisungsnummer) als varchar gespeichert wurden, wobei einige Einträge alphanumerische Werte enthielten und ich auffüllen musste, wenn die Länge kleiner als 6 Zeichen ist.

Dachte zu teilen, wenn jemand auf die gleiche Situation stößt

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
Tejasvi Hegde
quelle
0

Ein einfaches Beispiel wäre

    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))
Jonathan Santiago
quelle
0

Dazu habe ich eine Funktion erstellt, in der Sie die gewünschte Länge der Ausgabezeichen angeben können:

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

Beispielergebnisse

Jermaine
quelle
-5

Effizienter ist:

Select id, LEN(id)
From TableA
Order by 2,1 

The result :
id
----
1
2
12
123
1234
SECUBE
quelle
6
Wie beantwortet dies die Frage des OP zum Auffüllen mit Nullen?
Filburt