it-swarm.com.de

Wie platziere ich führende Nullen für Zahlen unter 10, ohne diese 10+ zu beeinflussen?

Wahrscheinlich eine neue Frage, aber ...

Ich habe eine Tabelle mit einem VARCHAR-Feld, das die Nummern 1 bis 300 enthält. Ich muss eine führende Null vor alle Zahlen unter 10 setzen, während die ursprüngliche Nummer beibehalten wird, wenn sie 10 oder größer ist (dh 1 = 01, 10 = 10 und 300 = 300).

SELECT DISTINCT RIGHT('0'+CONVERT(VARCHAR,[FacilityCode]),3) FROM...

Dies gibt 1 = 01, 10 = 010 und 300 = 300 zurück (unter Verwendung der gleichen Beispiele wie oben)

BEARBEITEN: Ich versuche dies innerhalb einer Abfrage zu tun, damit ich nachschlagen kann, ohne eine der Tabellen zu ändern.

Kann hier jemand einem Bruder helfen? Mein Gehirn funktioniert einfach nicht.

7
SnagQueensHubby

Am sichersten ist es wahrscheinlich, nur dann Nullen hinzuzufügen, wenn die Länge der Spalte 1 Zeichen beträgt:

UPDATE
   Table
SET
   MyCol = '0' + MyCol
WHERE
   LEN(MyCol) = 1;

Dies deckt alle Zahlen unter 10 ab und ignoriert auch alle Zahlen, die bereits eine führende 0 haben.

EDIT

Um nur die Daten auszuwählen, versuchen Sie:

SELECT
   MyColPadded = CASE WHEN LEN(MyCol) = 1 THEN '0' + MyCol ELSE MyCol END
FROM
   MyTable;
12
JNK

(Aus Ihrem Beispielcode geht hervor, dass Sie MS SQL Server verwenden, aber Sie sollten Ihrer Frage ein geeignetes Tag (und/oder einen Text) hinzufügen, um dies anzugeben, wenn ja, oder wenn nicht, welches DBMS Sie tatsächlich verwenden.)

Jede der oben genannten Optionen sollte einwandfrei funktionieren. Ich würde im Allgemeinen die Option "Präfix 0s" verwenden und dann die Option RIGHT() verwenden, wie Sie es getan haben, aber die anderen sind vollkommen gültig), aber ein Wort der Warnung, wenn Sie neue Zeilen erwarten (oder Aktualisierungen vorhandener Zeilen), um niedrige Zahlen zu enthalten - wenn dies möglich ist, schleichen sich ungepolsterte Werte wieder ein. Um dies zu vermeiden, können Sie entweder einen AFTER - oder einen INSTEAD OF - Trigger verwenden, um dies zu erzwingen Werte in das richtige Format, wenn sie eingefügt/aktualisiert werden, um zu verhindern, dass das Problem erneut auftritt (ohne dass alle in dieser Tabelle gespeicherten Codepunkte geändert werden müssen). Achten Sie jedoch darauf, die Leistung zu überprüfen: Trigger können sehr leistungsfähig sein, sind aber auch einfach Erstellen Sie mit ihnen einen Performance-Albtraum.

1
David Spillett

Sie können hierfür eine case-Anweisung verwenden, wenn diese in der Datenbank formatiert sein muss und Sie sie nicht beibehalten können.

Select case when len(facilityCode) = 1 then 
          '0' else '' end + facilityCode as facilityCode
From YourTable

Es hört sich so an, als würden Sie dies als FK tun. Wenn ja, können Sie keine FK-Einschränkung für eine Berechnung haben. Um die Verknüpfung zu vereinfachen, können Sie eine berechnete Spalte in Betracht ziehen.

 ALTER TABLE yourTable 
    ADD cFacilityCode AS (
      case when len(facilityCode) = 1 then '0' else '' end + facilityCode);
1
jmoreno

Wenn Sie eine dreistellige Nummer möchten, versuchen Sie dies.

SELECT DISTINCT 
RIGHT('000'+CAST(ISNULL([FacilityCode],0) AS VARCHAR),3) 
FROM...

Ergebnis: 1 = 001, 10 = 010 und 300 = 300

Eine 8-stellige Nummer wäre:

SELECT DISTINCT 
RIGHT('00000000'+CAST(ISNULL([FacilityCode],0) AS VARCHAR),8) 
FROM...

Ergebnis: 1 = 00000001, 10 = 00000010 und 300 = 00000300

Dies hat den Vorteil, mit Unterabfragen zu arbeiten:

SELECT t_lac.FORCE_OVERWRITE
            , ISNULL(lay.ID,0) AS lacIDLayout
            --, t_lac.lacName
            , CASE WHEN t_lac.lacIDControlType = 18
                THEN 'PAN' + RIGHT('000' + CAST(ISNULL((SELECT ID FROM Layout l WHERE l.layName = t_lac.lacName),0) AS VARCHAR),3) + '_' + t_lac.lacName
                ELSE t_lac.lacName
                END AS lacName
            , t_lac.lacIDControlType
            , t_lac.lacStyle 
            FROM @T_LayoutControl t_lac
            LEFT JOIN Layout lay ON lay.layName = t_lac.layName
0
Gareth White