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