Zeichen in Zeichenkette zählen mit SQL

In den populärsten Datenbanksystemen wie MySQL, SQL Server, PostgreSQL oder Oracle 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.

Die grundlegende Logik hinter dieser Funktion ist dabei nicht sehr kompliziert. Es wird die Anzahl der Zeichen der zu durchsuchenden Zeichenkette ermittelt. Im Anschluss wird die Anzahl der Zeichen ohne das gesuchte Zeichen ermittelt. Die Differenz ergibt die Anzahl des Zeichens in der Zeichenkette. Das Ergebnis kann nun zusätzlich noch durch die Länge des zu suchenden Zeichens geteilt werden. Dadurch kann auch eine Zeichenkette mit mehreren Bytes oder mehreren Zeichen in einer Zeichenkette gezählt werden.

SQL Server

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

Die Funktion verwendet zusätzlich ein COLLATE Latin1_General_CS_AS. Damit berücksichtigt diese Funktion auch die Groß- und Kleinschreibung bei der Ersetzung.

CREATE FUNCTION GetStringCount(@strValue VARCHAR(MAX), @strCount VARCHAR(MAX))
RETURNS INT
AS
BEGIN
  RETURN ISNULL((DATALENGTH(@strValue) - 
    DATALENGTH(REPLACE(@strValue COLLATE Latin1_General_CS_AS, @strCount, ''))) / 
    DATALENGTH(@strCount), 0);
END

Verwendung der Funktion und Beispiele

SELECT dbo.GetStringCount('Hello', 'l');
SELECT * FROM table_name WHERE dbo.GetStringCount(column_name, 'l') > 0;

MySQL

Unter MySQL gibt es, wie auch beim SQL Server, 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 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 unabhängig der Bytes und Collation. So wird für die Zeichenkette “5€” mit der Funktion LENGTH die Anzahl 4 ermittelt während mit der Funktion CHAR_LENGTH die Anzahl 2 ermittelt wird.

Die benutzerdefinierte Funktion mit CHAR_LENGTH

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

Die benutzerdefinierte Funktion LENGTH

CREATE FUNCTION GetStringCount(strValue TEXT, charValue TEXT)
RETURNS INTEGER DETERMINISTIC NO SQL
BEGIN
  RETURN IFNULL(FLOOR((LENGTH(strValue) - 
    LENGTH(REPLACE(strValue, charValue, ''))) / 
    LENGTH(charValue)), 0);
END

Verwendung der Funktion und Beispiele

SELECT GetStringCount('Hello', 'l');
SELECT * FROM table_name WHERE GetStringCount(column_name, 'l') > 0;

PostgreSQL

PostgreSQL stellt mehrere Funktionen zur Ermittlung der Länge einer Zeichenkette zur Verfügung. Die Funktionen LENGTH, CHAR_LENGTH und CHARACTER_LENGTH haben dabei die gleiche Funktionalität. In dieser Funktion wird CHAR_LENGTH verwendet um eine ähnliche Syntax zu den Lösungen der anderen SQL-Dialekte zu erhalten.

CREATE FUNCTION GetStringCount(strValue TEXT, strCount TEXT)
RETURNS INTEGER LANGUAGE SQL
AS '
  SELECT COALESCE((CHAR_LENGTH(strValue) - 
    CHAR_LENGTH(REPLACE(strValue, strCount, ''''))) / 
    CHAR_LENGTH(strCount), 0);
';

Verwendung der Funktion und Beispiele

SELECT GetStringCount('Hello', 'l');
SELECT * FROM table_name WHERE GetStringCount(column_name, 'l') > 0;

Oracle

Für Oracle könnte eine Lösung mit der Funktion REGEXP_COUNT erstellt werden. Bei der Verwendung von regulären Ausdrücken müssen allerdings spezielle Zeichen maskiert werden, damit diese nicht als Steuerzeichen berücksichtigt werden. Daher wird für diese Lösung die gleiche Logik wie auch in den anderen SQL-Dialekten verwendet.

CREATE FUNCTION GetStringCount(strValue NVARCHAR2, strChar NVARCHAR2)
RETURN NUMBER DETERMINISTIC IS
BEGIN
  RETURN COALESCE((LENGTH(strValue) - 
    LENGTH(REPLACE(strValue, strChar, ''))) / 
    LENGTH(strChar), 0);
END;
/

Verwendung der Funktion und Beispiele

SELECT GetStringCount('Hello', 'l') FROM dual;
SELECT column_name FROM table_name WHERE GetStringCount(column_name, 'l') > 0;
Avatar for Sebastian Brosch

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.

2 Antworten

  1. Avatar for Joachim Bonfert Joachim Bonfert sagt:

    Danke für solche Beiträge, als Hobbyprogrammierer ist man auf solche Information angewiesen.
    Geht das auch in SQLite?

    • Freut mich wenn ich dir mit diesem Beitrag helfen konnte.

      Das geht auch mit SQLite allerdings sind dort eigene Funktionen nur über eine Implementierung in C oder Erweiterungen möglich. Mit den vorhandenen Funktionen können aber auch Zeichen in einer Zeichenkette direkt in einer SQL-Abfrage gezählt werden:

      Ein Beispiel (Demo):
      SELECT column_name, (LENGTH(column_name) - LENGTH(REPLACE(column_name, 'l', ''))) / LENGTH('l') cnt
      FROM table_name

      Ich werde den Beitrag zukünftig noch um SQLite erweitern.

Schreibe einen Kommentar

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