计算PostgreSQL中字符串中子字符串的出现次数

新手上路,请多包涵

如何计算 PostgreSQL 中字符串中子字符串的出现次数?


例子:

我有一张桌子

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

我想编写一个查询,以便 result 包含列有多少次出现的子字符串 oname 包含。 For instance, if in one row, name is hello world , the column result should contain 2 , since there are two o 在字符串 hello world 中。

换句话说,我正在尝试编写一个将作为输入的查询:

在此处输入图像描述

并更新 result 列:

在此处输入图像描述


我知道函数 regexp_matches 及其 g 选项,这表明需要扫描完整的( g = global)字符串是否存在子字符串的出现)。

例子:

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

返回

{o}
{o}

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

返回

2

但是我不知道如何编写一个 UPDATE 查询,该查询将更新 result 列,使其包含子字符串出现的次数 name 包含。

原文由 Franck Dernoncourt 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.5k
2 个回答

一个常见的解决方案是基于这个逻辑: 将搜索字符串替换为空字符串,并将新旧长度之间的差异除以搜索字符串的长度

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

因此:

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

原文由 dnoeth 发布,翻译遵循 CC BY-SA 3.0 许可协议

返回字符数,

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

原文由 Guilherme Passos 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进