Wie können Sie alle nicht alphabetischen Zeichen aus einer Zeichenfolge entfernen?
Was ist mit nicht alphanumerischen?
Muss dies eine benutzerdefinierte Funktion sein oder gibt es auch allgemeinere Lösungen?
Wie können Sie alle nicht alphabetischen Zeichen aus einer Zeichenfolge entfernen?
Was ist mit nicht alphanumerischen?
Muss dies eine benutzerdefinierte Funktion sein oder gibt es auch allgemeinere Lösungen?
Versuchen Sie diese Funktion:
Create Function [dbo].[RemoveNonAlphaCharacters](@Temp VarChar(1000))
Returns VarChar(1000)
AS
Begin
Declare @KeepValues as varchar(50)
Set @KeepValues = '%[^a-z]%'
While PatIndex(@KeepValues, @Temp) > 0
Set @Temp = Stuff(@Temp, PatIndex(@KeepValues, @Temp), 1, '')
Return @Temp
End
Nennen Sie es so:
Select dbo.RemoveNonAlphaCharacters('abc1234def5678ghi90jkl')
Sobald Sie den Code verstanden haben, sollten Sie feststellen, dass es relativ einfach ist, ihn zu ändern, um auch andere Zeichen zu entfernen. Sie können diese sogar dynamisch genug gestalten, um Ihr Suchmuster weiterzugeben.
Ich hoffe es hilft.
Parametrisierte Version von G Mastros ' großartiger Antwort :
Nur alphabetisch:
Nur numerisch:
Nur alphanumerisch:
Nicht alphanumerisch:
quelle
SELECT dbo.fn_StripCharacters('a1!s2 spaces @d3# f4$', '^a-z0-9\s')
noch Leerzeichen entfernt werden. Ich habe auch versucht zu verwenden,[[:blank:]]
aber das bricht die Funktion und nichts wird aus der Zeichenfolge entfernt. Das nächste, was ich bekommen habe, ist die Verwendung von:SELECT dbo.fn_StripCharacters('a1!s2 spaces @d3# f4$', '^a-z0-9 ')
(hartes Codieren eines Leerzeichens im Regex-Muster). Zeilenumbrüche werden dadurch jedoch nicht entfernt.SELECT dbo.fn_StripCharacters('a1!s2 spaces @d3# f4$', '^ a-z0-9')
Ob Sie es glauben oder nicht, in meinem System ist diese hässliche Funktion besser als die elegante von G Mastros.
quelle
ASCII
Ganzzahl verwenden und die Ausgabe von direktSUBSTRING
mit einigen Zeichen vergleichen, z. B.:SET @ch=SUBSTRING(@s, @p, 1)
undIF @ch BETWEEN '0' AND '9' OR @ch BETWEEN 'a' AND 'z' OR @ch BETWEEN 'A' AND 'Z' ...
Ich wusste, dass SQL schlecht in der Manipulation von Zeichenfolgen ist, aber ich dachte nicht, dass es so schwierig sein würde. Hier ist eine einfache Funktion, um alle Zahlen aus einer Zeichenfolge zu entfernen. Es gibt bessere Möglichkeiten, dies zu tun, aber dies ist ein Anfang.
Ausgabe
Runde 2 - Datengesteuerte Blacklist
Ausgabe
Meine Herausforderung an die Leser: Können Sie dies effizienter gestalten? Was ist mit Rekursion?
quelle
Wenn Sie wie ich sind und nicht nur Funktionen zu Ihren Produktionsdaten hinzufügen können, aber dennoch diese Art der Filterung durchführen möchten, finden Sie hier eine reine SQL-Lösung, die eine PIVOT-Tabelle verwendet, um die gefilterten Teile wieder zusammenzusetzen.
NB Ich habe die Tabelle mit bis zu 40 Zeichen fest codiert. Sie müssen mehr hinzufügen, wenn Sie längere Zeichenfolgen zum Filtern haben.
quelle
Nachdem ich mir alle gegebenen Lösungen angesehen hatte, dachte ich, dass es eine reine SQL-Methode geben muss, die keine Funktion oder eine CTE / XML-Abfrage erfordert und keine schwierig zu verwaltenden verschachtelten REPLACE-Anweisungen beinhaltet. Hier ist meine Lösung:
Der Vorteil dieser Vorgehensweise besteht darin, dass die gültigen Zeichen in der einen Zeichenfolge in der Unterabfrage enthalten sind, sodass die Konfiguration für einen anderen Zeichensatz einfach ist.
Der Nachteil ist, dass Sie für jedes Zeichen bis zur Größe Ihrer Spalte eine SQL-Zeile hinzufügen müssen. Um diese Aufgabe zu vereinfachen, habe ich nur das folgende Powershell-Skript verwendet, dieses Beispiel für ein VARCHAR (64):
quelle
Hier ist eine andere Möglichkeit, nicht alphabetische Zeichen mit einem zu entfernen
iTVF
. Zunächst benötigen Sie einen musterbasierten String-Splitter. Hier ist einer aus dem Artikel von Dwain Camp :Nachdem Sie einen musterbasierten Splitter haben, müssen Sie die Zeichenfolgen teilen, die dem Muster entsprechen:
und verketten Sie sie dann wieder, um das gewünschte Ergebnis zu erzielen:
STICHPROBE
Ergebnis:
quelle
Diese Lösung, die von Mr. Allens Lösung inspiriert ist, erfordert eine
Numbers
Tabelle mit ganzen Zahlen (die Sie zur Hand haben sollten, wenn Sie ernsthafte Abfragevorgänge mit guter Leistung ausführen möchten). Es ist kein CTE erforderlich. Sie können denNOT IN (...)
Ausdruck ändern , um bestimmte Zeichen auszuschließen, oder ihn in einenIN (...)
ODER-LIKE
Ausdruck ändern , um nur bestimmte Zeichen beizubehalten.quelle
Hier ist eine Lösung, bei der keine Funktion erstellt oder alle zu ersetzenden Zeicheninstanzen aufgelistet werden müssen. Es verwendet eine rekursive WITH-Anweisung in Kombination mit einem PATINDEX, um unerwünschte Zeichen zu finden. Es ersetzt alle unerwünschten Zeichen in einer Spalte - bis zu 100 eindeutige fehlerhafte Zeichen in einer bestimmten Zeichenfolge. (EG "ABC123DEF234" würde 4 fehlerhafte Zeichen 1, 2, 3 und 4 enthalten.) Das Limit von 100 ist die maximale Anzahl von Rekursionen, die in einer WITH-Anweisung zulässig sind. Dies legt jedoch kein Limit für die Anzahl der zu verarbeitenden Zeilen fest ist nur durch den verfügbaren Speicher begrenzt.
Wenn Sie keine UNTERSCHIEDLICHEN Ergebnisse wünschen, können Sie die beiden Optionen aus dem Code entfernen.
quelle
Ich habe dies an beiden Stellen platziert, an denen PatIndex aufgerufen wird.
für die benutzerdefinierte Funktion über RemoveNonAlphaCharacters und benenne sie in RemoveNonAlphaNumericCharacters um
quelle
- Erstellen Sie zuerst eine Funktion
Rufen Sie diese Funktion nun wie auf
Sein Ergebnis gefällt
quelle
Aus Sicht der Leistung würde ich die Inline-Funktion verwenden:
quelle
Hier ist eine weitere rekursive CTE-Lösung, die auf der Antwort von @Gerhard Weiss hier basiert . Sie sollten in der Lage sein, den gesamten Codeblock zu kopieren und in SSMS einzufügen und dort damit zu spielen. Die Ergebnisse enthalten einige zusätzliche Spalten, damit wir besser verstehen, was los ist. Es dauerte eine Weile, bis ich alles verstand, was sowohl mit PATINDEX (RegEx) als auch mit dem rekursiven CTE vor sich geht.
quelle
Verwenden Sie eine von CTE generierte Zahlentabelle, um jedes Zeichen zu untersuchen, und dann FOR XML, um sich auf eine Zeichenfolge von beibehaltenen Werten zu konzentrieren, die Sie ...
quelle
quelle
Dieser Weg funktionierte nicht für mich, da ich versuchte, die arabischen Buchstaben beizubehalten. Ich versuchte, den regulären Ausdruck zu ersetzen, aber es funktionierte auch nicht. Ich habe eine andere Methode geschrieben, um auf ASCII-Ebene zu arbeiten, da dies meine einzige Wahl war und funktioniert hat.
GEHEN
quelle
Obwohl der Beitrag etwas alt ist, möchte ich Folgendes sagen. Das Problem, das ich mit der obigen Lösung hatte, ist, dass Zeichen wie ç, ë, ï usw. nicht herausgefiltert werden. Ich habe eine Funktion wie folgt angepasst (ich habe nur eine 80-varchar-Zeichenfolge verwendet, um Speicher zu sparen):
quelle
Ich habe gerade festgestellt, dass dies in Oracle 10g integriert ist, wenn Sie es verwenden. Ich musste alle Sonderzeichen entfernen, um die Telefonnummer vergleichen zu können.
quelle