2017-05-15 5 views
1

Wir versuchen, bestimmte Sonderzeichen aus einer Zeichenfolge zu entfernen, indem Sie den (vereinfachten) Befehl unten verwenden. Dies ist die gängigste Lösung, die wir nach der Suche gesehen haben. Aber die Ergebnisse sind inkonsistent, wenn bestimmte Sonderzeichen verwendet werden. Kann mir jemand erklären warum? Und, besser, kann jemand eine Lösung anbieten, die funktioniert?Warum schlägt die Ersetzung mit PATINDEX für bestimmte Sonderzeichen fehl?

SQL Server 2014

Im ersten Fall unten wird die '@' entfernt, aber in allen anderen Fällen, in denen es enthalten ist (2 + 5) ist es nicht entfernt wird. Das Gleiche gilt für den 3. Fall: Die Leerzeichen werden entfernt, aber nicht die '&'; und im fünften Fall werden die Leerzeichen entfernt, aber nicht das '@'. Andere Kombinationen haben ähnliche Probleme.

Danke. declare @str varchar (50) = '1st Ave @ 1st St FL-3 Rm 323 & New York NY'

declare @Pindex1 varchar(10) = '%[@]%' 
declare @Pindex2 varchar(10) = '%[@& ]%' 
declare @Pindex3 varchar(10) = '%[& ]%' 
declare @Pindex4 varchar(10) = '%[ ]%' 
declare @Pindex5 varchar(10) = '%[@ ]%' 

Select @str as String, @Pindex1 as Pattern ,Replace(@str, Substring(@str, PatIndex(@Pindex1,@str), 1), '') as PIndex1_result 
Select @str as String, @Pindex2 as Pattern ,Replace(@str, Substring(@str, PatIndex(@Pindex2,@str), 1), '') as PIndex2_result 
Select @str as String, @Pindex3 as Pattern ,Replace(@str, Substring(@str, PatIndex(@pindex3,@str), 1), '') as PIndex3_result 
Select @str as String, @Pindex4 as Pattern ,Replace(@str, Substring(@str, PatIndex(@Pindex4,@str), 1), '') as PIndex4_result 
Select @str as String, @Pindex5 as Pattern,Replace(@str, Substring(@str, PatIndex(@pindex5,@str), 1), '') as PIndex5_result 
+0

Nicht sicher, was Sie erwartet haben. Die meisten Ihrer Muster können mehrere mögliche Zeichen enthalten, "Patindex" findet jedes Mal die erste Übereinstimmung, Sie ersetzen dann das gefundene Zeichen aus der Zeichenfolge. Offensichtlich bleiben die anderen möglichen Übereinstimmungen (andere Zeichen, die das Muster erfüllen könnte) in der Kette unverändert. Ihr zweites Muster ist ungültig (versucht einen Bereich von '@' bis 'Leerzeichen 'zu definieren, sollte' '% [- @]%'') sein, das letzte Muster ist ebenfalls ungültig (sollte ''% [@]% sein ""), aber das Reparieren der Muster löst nicht das Problem, das Muster nur einmal zu materialisieren. – GSerg

+0

Sie müssen eine Schleife ausführen, bis 'PatIndex' keine Übereinstimmungen mehr findet. – GSerg

+0

Von dem, was ich gesehen habe, ist Schleifen nicht notwendig - es entspricht wiederholt jeder Instanz eines Zeichens innerhalb der []. (Ich versuche nicht, eine Bereichsfunktion zu verwenden. Das war ein Fehler in meinem Beispiel. Siehe meine bearbeitete Frage.) Das passiert bei einer Vielzahl von Zeichen in unseren Tests, aber nicht mit dem '@' Zeichen. – LBerg

Antwort

1

Ich glaube, Sie könnten ein Missverständnis von SQL-Server-Muster haben. Betrachten Sie das zweite Muster:

declare @Pindex2 varchar(10) = '%[@- ]%' 

Dies kann kein Muster übereinstimmen. Warum? Der ASCII-Wert '@' ist 64 und für ein Leerzeichen ist es 32. Zwischen diesen Werten tritt nichts auf. Es ist ähnlich wie '%[b-a]%', die auch nichts zusammenbringen würde.

Ich denke, das Problem ist Ihr Verständnis von SQL Server String-Mustern.

+0

Ich sehe das Problem mit '-' Zeichen jetzt. Ich habe nicht nach Bereichen gesucht (was das '-' tut). Ich habe versucht, jeden der Charaktere im [] zu ersetzen. Ich habe meine Beispiele ein wenig bearbeitet, um dieses Problem besser zu zeigen. – LBerg

Verwandte Themen