如何按行查找列中的单词数(所有单词和唯一单词)?

Pra*_*jal 5 postgresql

我的 Postgresql 数据库中有一个名为Description包含文本的列。出于某些分析目的,我想查找该描述中的单词总数(以空格分隔)(所有单词和唯一单词),并在 columnsword_count和中设置这些计数unique_word_count。例如。

ID 描述
1 美好的一天
2 这是一个产品。它是有益的

我想要有以下输出:

ID 字数 唯一字数 描述
1 4 4 美好的一天
2 7 6 这是一个产品。它是有益的

for是 6 unique_word_countid = 2因为这个词is已经重复了 2 次。

Vér*_*ace 6

编辑:

我对我的回答不是 100% 满意,因此我在这里为我自己关于这个主题的问题授予了奖金。

Erwin Brandstetter(像往常一样)提供了一个崇高的答案- 请使用它而不是我在下面写的内容 - 除非你的用例非常简单,即使如此......

=================================================== ===========

为了解决您的问题,我做了以下操作:

CREATE TABLE wordcount (id SERIAL NOT NULL PRIMARY KEY, description TEXT NOT NULL);
Run Code Online (Sandbox Code Playgroud)

填充它:

INSERT INTO wordcount (description) VALUES ('What a great day');
INSERT INTO wordcount (description) VALUES ('This is a product. It is useful');
Run Code Online (Sandbox Code Playgroud)

然后执行以下查询(此处提供小提琴):

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;
Run Code Online (Sandbox Code Playgroud)

结果:

ID 字数 唯一字数计数 描述
1 4 4 美好的一天
2 7 6 这是一个产品。它是有益的

如果你对这一切都不熟悉,我建议你浏览一下这里的小提琴,它显示了我的思维过程的发展,导致了上面的查询。

我建议您将此逻辑放入 onInsert/onUpdate 触发器中 - 它可能相当计算密集。