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;
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.