André Krämers Blog

Lösungen für Ihre Probleme

T-SQL bietet keine Möglichkeit die Vorkommnisse eines Zeichens innerhalb einer Zeichenkette zu zählen.

Richtig! Nun ja, zumindest fast. Zwar gibt es keine eingebaute Funktion, mit folgendem Konstrukt lässt sich die Anforderung jedoch trotzdem erfüllen:

     -- Anzahl der vorkommenden 't' zählen
    Select
    CompanyName,
    len(CompanyName) - len(replace(CompanyName, 't', '')) as Anzahl
    from
    Customers

Im gewählten Beispiel, welches übrigens auf der Northwind Datenbank ausprobiert werden kann, werden die Anzahl der ’t’ innerhalb des Felds CompanyName gezählt.

Die Funktionsweise ist recht einfach:

Zuerst wird in Zeile 4 die Länge des Namens ermittelt. Im Beispiel von ‘Alfreds Futterkiste’ wäre dies 19. Anschließend werden alle ’t’ innerhalb von ‘Alfreds Futterkiste’ durch einen leeren Character ersetzt und die Länge von 16 Zeichen ermittelt. Als letztes wird der zweite Wert vom ersten subtrahiert, so dass wir auf unser Ergebnis von 3 kommen.

Eigentlich ganz einfach, oder :-)

Es gibt 3 Kommentare

Comment by Jürgen Auer
Von | 29.10.2011 21:11
> Eigentlich ganz einfach, oderLeider nicht ganz, da das in manchen Fällen zu falschen Ergebnissen führen kann.Der Sql-Server berücksichtigt Leerzeichen am Ende nicht bei der Len-Funktion.Wird ein String 'test t' der Länge 6 so ausgewertet, dann kommt 'es ' heraus - mit Len('es ') = 2, also wurden in 'test t' 4 't' gefunden.Zwar selten, aber prinzipiell möglich. Bsp. dann, wenn man so nach Wörtern bzw. Wortteilen sucht und der gesuchte Ausdruck als Wort (mit Leerzeichen davor) am Ende steht.
Comment by Jürgen Auer
Von | 29.10.2011 21:11
PS: Grade nochmals auf meiner eigenen Seitewww.sql-und-xml.de/.../len.htmlnachgesehen:Man kann stattdessen die DataLength - Funktion nutzen. Die berücksichtigt Leerzeichen am Ende korrekt.Das Ergebnis muß man allerdings durch 2 teilen, falls man nvarchar nutzt.