2016-12-12 3 views
1

Ich versuche, LPAD-Funktion in SQL Server herauszufinden. Ich habe eine Syntax gefunden, aber das Ergebnis ist nicht das, was ich erwarte. Die Spalten-ID ist definiert als varchar. Ich möchte die abhängige Zeichenfolge '04130' basierend auf der Länge der ID-Spalte replizieren. Alle Hinweise werden sehr geschätzt. Dieser DankLPAD in SQL Server

SELECT 
    ID, 
    RIGHT(REPLICATE('04130', 12)+LEFT(ID, 12), 12) --- (LPAD in sql server) 
FROM 
    S_Information_Tab; 

ist die Ausgabe erhalte ich

ID  (No column name) 
6452 130041306452 
6495 130041306495 

Dies ist die erwartet Ausgang:

ID (No column name)    
6452 041300416452 
6495 041300416495 
+1

OK, also zunächst replizieren Sie die '04 130 'string 12 mal, geben '041300413004130041300413004130041300413004130041300413004130', dann fügen Sie die ersten zwölf Zeichen der' ID', die '6452' ist, also weniger als 12, so fügen Sie sie alle, so dass Sie' 0413004130041300413004130041300413004130041300413004130041306452', dann nehmen Sie die rechten 12 Zeichen davon, geben Ihnen '130041306452', können Sie erklären, * was Sie wollen * andere als * Ergebnisse ist nicht das, was ich erwarte *? –

+1

Können Sie lieber erklären, was Sie wollen, warum Sie es wollen, welche Regeln folgen dieser Ausgabe? Weil dieser Teil in Ihrer Frage gar nicht klar ist. –

+0

Lasse V. Karlsen macht einen guten Punkt. Wenn Sie Hilfe und Rat benötigen, um Ihre Frage zu formatieren, werfen Sie einen Blick [hier] (http://meta.stackoverflow.com/questions/333952/why-should-i-provide-an-mcve-for-what- scheint-zu-mir-eine-sehr-einfache-sql-Abfrage) und [hier] (http://stackoverflow.com/help/mcve). –

Antwort

2

Ich glaube, ich verstehe Ihre Frage. Die Länge der replizierten Zeichenfolge hängt von der Länge Ihrer ID ab. Ich denke, es wäre am besten, um die Länge der Zeichenfolge zu finden, subtrahieren, dass der endgültige Länge dann concat replizierten Zeichenfolge wie folgt:

select concat(substring(REPLICATE('04130', 12),1,12-len(id)),id) 
    FROM S_Information_Tab; 
+0

kann auch Replikat überspringen und '041300413004130' –

+0

@AlexK verwenden. darüber nachgedacht, ich habe in Replicate * 12 hinzugefügt, fragte mich, warum es 12 war und ich denke, wenn diese Zeichenfolge halbdynamisch sein sollte, könnten sie es zu einer Zeichenkette ändern und wenn mit Null kombiniert würde füllen 12 Leerzeichen ie ('replicate ('a', 12) + null) – EoinS

+0

seine 12 Ich denke, weil der Frage-Code eine kopierte Version von Padding mit Blei Null oder ein anderes einzelnes Zeichen ist. 3 ist in Ordnung, ich denke, als 5 (Länge der Zeichenfolge) * 3 ist der erste Wert> 12. –

0

Der einfachste Weg, um das gewünschte Ergebnis zu erzielen ist:

-- Prefixing a string field. 
SELECT  
    '04130041' + ID 
FROM 
    (
     -- Embedded sample rows. 
     VALUES 
      ('6452'), 
      ('6495') 
    ) AS S_Information_Tab(ID) 
; 

Hier habe ich eine table value constructor verwendet, um die Beispielwerte aus Ihrer Frage zu generieren.

Left gibt x Zeichen vom Anfang einer Zeichenfolge zurück. Wenn die erforderliche Anzahl die Länge der Zeichenfolge überschreitet, wird die gesamte Zeichenfolge zurückgegeben. Beispiele:

-- Left examples. 
SELECT 
    LEFT('123', 1) AS [R1], 
    LEFT('123', 2) AS [R2], 
    LEFT('123', 3) AS [R3], 
    LEFT('123', 4) AS [R4] 
; 

Returns

R1 R2 R3 R4 
1 12 123 123 
1

Angenommen, Ihre ID von Nvarchar-Typ ist, dies würde Ihnen die erwartete Ausgabe.

SELECT 
    ID, 
    CONCAT(LEFT(REPLICATE('04130', 12),8),LEFT(ID,4)) 
FROM 
    S_information_tab; 

Überprüfen Sie auch diese Links:

https://msdn.microsoft.com/en-us/library/ms177601.aspx

https://msdn.microsoft.com/en-us/library/ms174383.aspx


Für Testzwecke

CREATE TABLE #TMP (
    ID NVARCHAR(10) 
); 

INSERT INTO #TMP (ID) 
VALUES 
('6452') 
,('6495'); 

SELECT 
    ID 
    ,CONCAT(LEFT(REPLICATE('04130', 12),8),LEFT(ID,4)) 
FROM 
    #TMP; 

DROP TABLE #TMP;