EDIT:
Not being 100% happy with my answer, I awarded a bonus for a question of my own on this topic here.
Erwin Brandstetter (as usual) provided a sublime answer - please use that instead of what I wrote below - unless your use case is very simple and even then...
==============================================================
To solve your issue I did the following:
CREATE TABLE wordcount (id SERIAL NOT NULL PRIMARY KEY, description TEXT NOT NULL);
Populate it:
INSERT INTO wordcount (description) VALUES ('What a great day');
INSERT INTO wordcount (description) VALUES ('This is a product. It is useful');
Then performed the following query (fiddle available here):
WITH arranged AS
(
SELECT id,
UNNEST
(
STRING_TO_ARRAY
(
REGEXP_REPLACE(description, '[^\w\s]', '', 'g'), ' '
)
) AS word,
description
FROM wordcount
)
SELECT a.id, COUNT(a.word), COUNT(DISTINCT(a.word)), a.description
FROM arranged a
GROUP BY a.id, a.description;
Result:
| id |
Word_Count |
Unique_Word_Count |
Description |
| 1 |
4 |
4 |
What a great day |
| 2 |
7 |
6 |
This is a product. It is useful |
If you're new to all this, I would advise you to go through the fiddle here which shows the development of my thought processes which led to the query above.
I would advise you to put this logic into an onInsert/onUpdate trigger - it's probably fairly computationally intensive.