How can I count the number of occurrences of a substring within a string in PostgreSQL?
Example:
I have a table
CREATE TABLE test."user" ( uid integer NOT NULL, name text, result integer, CONSTRAINT pkey PRIMARY KEY (uid) )
I want to write a query so that the result
contains column how many occurrences of the substring o
the column name
contains. For instance, if in one row, name
is hello world
, the column result
should contain 2
, since there are two o
in the string hello world
.
In other words, I'm trying to write a query that would take as input:
and update the result
column:
I am aware of the function regexp_matches
and its g
option, which indicates that the full (g
= global) string needs to be scanned for the presence of all occurrences of the substring).
Example:
SELECT * FROM regexp_matches('hello world', 'o', 'g');
returns
{o} {o}
and
SELECT COUNT(*) FROM regexp_matches('hello world', 'o', 'g');
returns
2
But I don't see how to write an UPDATE
query that would update the result
column in such a way that it would contain how many occurrences of the substring o the column name
contains.
count() Return Value count() method returns the number of occurrences of the substring in the given string.
CHAR_LENGTH() function The PostgreSQL char_length function or character_length function is used to count the number of characters in a specified string. The CHARACTER_LENGTH() function is similar to CHAR_LENGTH() function. A string whose length is to be retrieved.
The PostgreSQL COUNT function counts a number of rows or non-NULL values against a specific column from a table. When an asterisk(*) is used with count function the total number of rows returns. Syntax: COUNT (* | [DISTINCT] ALL | column_name)
A common solution is based on this logic: replace the search string with an empty string and divide the difference between old and new length by the length of the search string
(CHAR_LENGTH(name) - CHAR_LENGTH(REPLACE(name, 'substring', ''))) / CHAR_LENGTH('substring')
Hence:
UPDATE test."user" SET result = (CHAR_LENGTH(name) - CHAR_LENGTH(REPLACE(name, 'o', ''))) / CHAR_LENGTH('o');
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With