it-swarm.com.de

Zählen der Anzahl der Vorkommen eines Teilstrings in einem String in PostgreSQL

Wie kann ich die Anzahl der Vorkommen eines Teilstrings in einem String in PostgreSQL zählen?


Beispiel:

Ich habe einen tisch

CREATE TABLE test."user"
(
  uid integer NOT NULL,
  name text,
  result integer,
  CONSTRAINT pkey PRIMARY KEY (uid)
)

Ich möchte eine Abfrage schreiben, damit die result-Spalte enthält, wie viele Vorkommen des Teilstrings o die Spalte name enthält. Wenn zum Beispiel in einer Zeile namehello world ist, sollte die Spalte result2 enthalten, da in der Zeichenfolge hello world zwei o enthalten sind.

Mit anderen Worten, ich versuche, eine Abfrage zu schreiben, die als Eingabe dienen würde:

 enter image description here

und aktualisieren Sie die result-Spalte:

 enter image description here


Ich kenne die Funktion regexp_matches und die g-Option, die angibt, dass der vollständige String (g = global) auf Vorhandensein aller Vorkommen des Teilstrings überprüft werden muss. 

Beispiel:

SELECT * FROM regexp_matches('hello world', 'o', 'g');

kehrt zurück

{o}
{o}

und 

SELECT COUNT(*)  FROM regexp_matches('hello world', 'o', 'g');

kehrt zurück

2

Aber ich sehe nicht, wie man eine UPDATE-Abfrage schreibt, die die result-Spalte so aktualisiert, dass sie enthält, wie viele Vorkommen des Teilstrings der Spalte name enthalten.

26

Eine gängige Lösung basiert auf dieser Logik: Ersetzen Sie die Suchzeichenfolge durch eine leere Zeichenfolge und teilen Sie die Differenz zwischen alter und neuer Länge durch die Länge der Suchzeichenfolge.

(CHAR_LENGTH(name) - CHAR_LENGTH(REPLACE(name, 'substring', ''))) 
/ CHAR_LENGTH('substring')

Daher:

UPDATE test."user"
SET result = 
    (CHAR_LENGTH(name) - CHAR_LENGTH(REPLACE(name, 'o', ''))) 
    / CHAR_LENGTH('o');
32
dnoeth

Bei einer Postgres'y-Methode wird der String in ein Array konvertiert und die Länge des Arrays gezählt (und dann 1 abgezogen):

select array_length(string_to_array(name, 'o'), 1) - 1

Beachten Sie, dass dies auch bei längeren Teilstrings funktioniert.

Daher:

update test."user"
    set result = array_length(string_to_array(name, 'o'), 1) - 1;
20
Gordon Linoff

Anzahl der Zeichen zurückgeben,

 SELECT (LENGTH('1.1.1.1') - LENGTH(REPLACE('1.1.1.1','.',''))) AS count
--RETURN COUNT OF CHARACTER '.'
1

Occcurence_Count = LENGTH (REPLACE (string_zu_suche, string_to_find, '~')) - LENGTH (REPLACE (string_zu_suche, string_zu_find, ''))

Diese Lösung ist etwas sauberer als viele, die ich je gesehen habe, vor allem ohne Divisor. Sie können dies in eine Funktion umwandeln oder in einem Select verwenden.
Keine Variablen erforderlich . Ich verwende Tilde als Ersatzzeichen, aber jedes Zeichen, das nicht in der Datenmenge enthalten ist, funktioniert.

0
Robert Bondy

Andere Weise:

UPDATE test."user" SET result = length(regexp_replace(name, '[^o]', '', 'g'));
0
bnson