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
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
Sie müssen eine Schleife ausführen, bis 'PatIndex' keine Übereinstimmungen mehr findet. – GSerg
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