Ich benutze dies seit einiger Zeit:
SUBSTRING(str_col, PATINDEX('%[^0]%', str_col), LEN(str_col))
In letzter Zeit habe ich jedoch ein Problem mit Spalten mit allen "0" -Zeichen wie "00000000" festgestellt, da niemals ein nicht "0" -Zeichen gefunden wird, das übereinstimmt.
Eine alternative Technik, die ich gesehen habe, ist die Verwendung von TRIM
:
REPLACE(LTRIM(REPLACE(str_col, '0', ' ')), ' ', '0')
Dies hat ein Problem, wenn eingebettete Leerzeichen vorhanden sind, da diese in "0" umgewandelt werden, wenn die Leerzeichen wieder in "0" umgewandelt werden.
Ich versuche eine skalare UDF zu vermeiden. Ich habe in SQL Server 2005 viele Leistungsprobleme mit UDFs festgestellt.
sql
sql-server
sql-server-2005
tsql
string
Cade Roux
quelle
quelle
Antworten:
quelle
Arvo
auf SO gesehen!Warum wirfst du den Wert nicht einfach auf
INTEGER
und dann zurück zuVARCHAR
?quelle
SELECT CASE ISNUMERIC(str_col) WHEN 1 THEN CAST(CAST(str_col AS BIGINT) AS VARCHAR(255)) ELSE str_col END
BIGINT
schlagen einige Arten von Zeichenfolgen diese Konvertierung immer noch fehl. Betrachten Sie0001E123
zum Beispiel.Andere Antworten hier nicht zu berücksichtigen, wenn Sie alle Nullen (oder sogar eine einzelne Null) haben.
Einige setzen eine leere Zeichenfolge standardmäßig auf Null, was falsch ist, wenn sie leer bleiben soll.
Lesen Sie die ursprüngliche Frage erneut. Dies beantwortet, was der Fragesteller will.
Lösung 1:
Lösung Nr. 2 (mit Beispieldaten):
Ergebnisse:
Zusammenfassung:
Sie könnten das, was ich oben habe, für eine einmalige Entfernung von führenden Nullen verwenden.
Wenn Sie vorhaben, es häufig wiederzuverwenden, platzieren Sie es in einer Inline-Table-Valued-Funktion (ITVF).
Ihre Bedenken hinsichtlich Leistungsproblemen mit UDFs sind verständlich.
Dieses Problem gilt jedoch nur für All-Scalar-Funktionen und Multi-Statement-Table-Funktionen.
Die Verwendung von ITVFs ist vollkommen in Ordnung.
Ich habe das gleiche Problem mit unserer Datenbank von Drittanbietern.
Mit alphanumerischen Feldern werden viele ohne die führenden Leerzeichen eingegeben, verdammte Menschen!
Dies macht Verknüpfungen unmöglich, ohne die fehlenden führenden Nullen zu bereinigen.
Fazit:
Anstatt die führenden Nullen zu entfernen, sollten Sie Ihre abgeschnittenen Werte bei Ihren Verknüpfungen nur mit führenden Nullen auffüllen.
Besser noch, bereinigen Sie Ihre Daten in der Tabelle, indem Sie führende Nullen hinzufügen und dann Ihre Indizes neu erstellen.
Ich denke, das wäre viel schneller und weniger komplex.
quelle
Anstelle eines Leerzeichens ersetzen Sie die Nullen durch ein 'seltenes' Leerzeichen, das normalerweise nicht im Text der Spalte enthalten sein sollte. Ein Zeilenvorschub ist wahrscheinlich gut genug für eine solche Spalte. Dann können Sie normal LTrim und das Sonderzeichen wieder durch Nullen ersetzen.
quelle
Folgendes gibt '0' zurück, wenn die Zeichenfolge vollständig aus Nullen besteht:
quelle
Das macht eine schöne Funktion ....
quelle
cast (Wert als int) funktioniert immer, wenn string eine Zahl ist
quelle
Meine Version davon ist eine Adaption von Arvos Arbeit, mit etwas mehr, um zwei weitere Fälle zu gewährleisten.
1) Wenn wir alle Nullen haben, sollten wir die Ziffer 0 zurückgeben.
2) Wenn wir ein Leerzeichen haben, sollten wir trotzdem ein Leerzeichen zurückgeben.
quelle
Der Vorschlag von Thomas G arbeitete für unsere Bedürfnisse.
Das Feld in unserem Fall war bereits eine Zeichenfolge und nur die führenden Nullen mussten abgeschnitten werden. Meistens ist alles numerisch, aber manchmal gibt es Buchstaben, sodass die vorherige INT-Konvertierung abstürzt.
quelle
Dies hat eine Begrenzung für die Länge der Zeichenfolge, die in eine INT konvertiert werden kann
quelle
Wenn Sie Snowflake SQL verwenden, verwenden Sie möglicherweise Folgendes:
Die Funktion ltrim entfernt alle Instanzen des angegebenen Zeichensatzes von der linken Seite.
Ltrim (str_col, '0') auf '00000008A' würde also '8A' zurückgeben.
Und rtrim (str_col, '0.') Auf '$ 125.00' würde '$ 125' zurückgeben.
quelle
Funktioniert auch mit '0', '00' und so weiter.
quelle
Versuche dies:
quelle
Wenn Sie nicht in int konvertieren möchten, bevorzuge ich die folgende Logik, da sie Nullen verarbeiten kann. IFNULL (Feld, LTRIM (Feld, '0'))
quelle
In MySQL können Sie dies tun ...
quelle