Zeichen in Zeichenkette zählen mit SQL

In MySQL sowie in T-SQL gibt es keine Funktion um die Anzahl eines bestimmten Zeichens oder einer Zeichenkette in einer Zeichenkette zu ermitteln. Eine solche Funktion kann aber sehr einfach erstellt und in SQL-Abfragen verwendet werden.

T-SQL (ab SQL-Server 2008)

Mit T-SQL kann die Länge einer Zeichenkette mit den Funktionen LEN und DATALENGTH ermittelt werden. Die Funktion LEN ermittelt die Anzahl der Zeichen, jedoch ohne die evtl. vorhandenen Leerzeichen am Ende der Zeichenkette. Daher wird zur Ermittlung der Anzahl der Zeichen hier die Funktion DATALENGTH verwendet, da diese alle vorhandenen Zeichen berücksichtigt.

-- function using DATALENGTH
CREATE FUNCTION GetStringCount(@strValue VARCHAR(200), @charValue VARCHAR(200))
RETURNS VARCHAR(200)
AS
BEGIN
  RETURN (DATALENGTH(@strValue) - DATALENGTH(REPLACE(@strValue, @charValue, ''))) / DATALENGTH(@charValue)
END

Die Funktion kann wie folgt in einer SQL-Abfrage verwendet werden (Online-Demo):

-- on SELECT
SELECT dbo.GetStringCount('Hello World', 'l'); -- 3
SELECT dbo.GetStringCount('Test Test', 'es');  -- 2

-- on WHERE
SELECT * FROM table_name WHERE dbo.GetStringCount(column_name, 'l') = 3

MySQL

Auch unter MySQL gibt es zwei Funktionen um die Länge einer Zeichenkette zu ermitteln. So stehen die Funktionen LENGTH und CHAR_LENGTH zur Verfügung. Auch zwischen diesen Funktionen gibt es einen Unterschied. Die Funktion LENGTH ist dabei stark abhängig von den vorhandenen Zeichen und der verwendeten Collation („Zeichensatzsortierung“) da diese die Anzahl der Bytes in der Zeichenkette ermittelt. Während der Buchstabe „A“ mit einem Byte darstellbar ist, wird das Zeichen „€“ mit drei Bytes dargestellt. Die Funktion CHAR_LENGTH dagegen ermittelt die echte Anzahl der Zeichen. So wird für die Zeichenkette „5€“ und der Funktion LENGTH die Anzahl 4 ermittelt während mit der Funktion CHAR_LENGTH die Anzahl 2 ermittelt wird.

Es können aber trotzdem beide Funktionen zur Ermittlung der Anzahl verwendet werden:

-- function using LENGTH
DELIMITER //

CREATE FUNCTION GetStringCount(strValue VARCHAR(200), charValue VARCHAR(200))
RETURNS INTEGER DETERMINISTIC NO SQL
BEGIN
  RETURN FLOOR((LENGTH(strValue) - LENGTH(REPLACE(strValue, charValue, ''))) / LENGTH(charValue));
END
-- function using CHAR_LENGTH
DELIMITER //

CREATE FUNCTION GetStringCount(strValue VARCHAR(200), charValue VARCHAR(200))
RETURNS INTEGER DETERMINISTIC NO SQL
BEGIN
  RETURN (CHAR_LENGTH(strValue) - CHAR_LENGTH(REPLACE(strValue, charValue, ''))) / CHAR_LENGTH(charValue);
END

Die Verwendung der Funktion in einer SQL-Abfrage könnte wie folgt aussehen (Online-Demo):

-- on SELECT
SELECT GetStringCount('Hello World', 'l'); -- 3
SELECT GetStringCount('Test Test', 'es');  -- 2

-- on WHERE
SELECT * FROM table_name WHERE GetStringCount(column_name, 'l') = 3

Die grundlegende Logik hinter diesen Funktionen ist dabei nicht sehr kompliziert. Es wird die Anzahl der Zeichen der vollständigen Zeichenkette ermittelt. Im Anschluss wird die Anzahl der Zeichen ohne das gewünschte Zeichen ermittelt. Die Differenz ergibt die Anzahl des Zeichens in der Zeichenkette. Das Ergebnis kann nun zusätzlich durch die Länge des Zeichens geteilt werden. Dadurch kann auch eine Zeichenkette oder ein Zeichen mit mehreren Bytes (bei Verwendung von LEN) in einer Zeichenkette gezählt werden.

Diese Logik wurde auch zur Lösung eines Problems auf StackOverflow verwendet.

Sebastian Brosch

Ich bin gelernter Fachinformatiker für Anwendungsentwicklung und konnte bereits Erfahrungen in der Entwicklung von Desktop- und Web-Anwendungen sammeln. In diesem Blog schreibe ich über Probleme und Erfahrungen aus dem Gebiet der Anwendungsentwicklung. Ich werde hier meist Artikel aus den Bereichen .NET, Datenbanken (hauptsächlich T-SQL und MySQL), PHP, HTML, CSS und Docker schreiben.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.