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

7

Wahrscheinlich eine neue Frage, aber ...

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

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

Dies ergibt 1 = 01, 10 = 010 und 300 = 300 (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.

SnagQueensHubby
quelle
Ein besonderer Grund Sie nicht wollen , 1zu sein 001?
RolandoMySQLDBA
RolandoMySQLDBA - Die zugehörige Tabelle enthält Varchar-Werte, die dem obigen Beispiel folgen. Mark, ich benutze MSSQL 2008 r2. Alle ... Ich versuche dies durch eine Abfrage zu tun, um Elemente in einer verwandten Tabelle auszuwählen, die die Zahlen (die tatsächlich Varchare sind) auf die oben dargestellte Weise formatiert.
SnagQueensHubby

Antworten:

12

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.

BEARBEITEN

Um nur die Daten auszuwählen, versuchen Sie:

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

(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 RIGHT()einwandfrei funktionieren. Ich würde im Allgemeinen das "Präfix 0s" verwenden und dann die Option verwenden, wie Sie es getan haben, aber die anderen sind vollkommen gültig. Aber ein Wort der Warnung, wenn Sie erwarten, dass neue Zeilen (oder Aktualisierungen vorhandener Zeilen) enthalten Niedrige Zahlen - Wenn dies möglich ist, schleichen sich ungepolsterte Werte wieder ein. Um dies zu vermeiden, können Sie entweder einen AFTERoder einen INSTEAD OFTrigger verwenden, um Werte in das richtige Format zu zwingen, wenn sie eingefügt / aktualisiert werden, um zu verhindern, dass das Problem erneut auftritt (ohne Sie müssen jedoch alle Codepunkte ändern, die in dieser Tabelle gespeichert werden. Überprüfen Sie jedoch die Leistung: Trigger können sehr leistungsfähig sein, aber es ist auch einfach, mit ihnen einen Leistungsalptraum zu erstellen.

David Spillett
quelle
1

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);
jmoreno
quelle
0

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
Gareth White
quelle
-1
UPDATE MyTable
SET MyColumn = '0' + Mycolumn
WHERE MyColumn < '10'
AND MyColumn NOT LIKE '0%';
Phrancis
quelle
1
Das OP gab an, dass der Mindestwert 1 ist. Wenn Sie jedoch mindestens zwei Ziffern und Null haben möchten, möchten Sie im Allgemeinen eine weitere Null hinzufügen, sodass ich LEN(wie in der Antwort von JNK) anstelle von verwenden würde LIKE.
hvd
3
Die Logik hinter der Antwort ist vernünftig, aber die Antwort ist aus einem ganz anderen Grund nicht korrekt als die obigen Kommentare. MyColumnist ein varchar, daher führt die Bedingung MyColumn < '10'nicht dazu, TRUEwenn der Wert in der Spalte '2'oder '3'oder ... ist '9'. Für char-Werte '9' < '10'ist false.
Ypercubeᵀᴹ
2
Stimmen Sie mit @ypercube überein. Sie könnten den ersten Vergleich ändern , MyColumn < 10aber das könnte brechen , wie wir wissen nicht , ob MyColumnist garantiert , immer nur Zahlen enthalten.
Andriy M
-4
declare @num varchar(50) = '7'
select case when @num<100 
            then RIGHT('00'+ CONVERT(VARCHAR(50),@num),2) 
            else CONVERT(varchar(50),@num) end 
Amit Poddar
quelle
4
Willkommen auf der Website. Versuchen Sie zusammen mit Code, eine Aussage zum besseren Verständnis aufzuschreiben.
Md Haidar Ali Khan
Außerdem - warum 100 als Grenzwert verwenden, wenn 10 besser wäre - sollten nur Werte von 0 bis 9 mit einer zusätzlichen Null versehen werden.
RDFozz