计算PostgreSQL

时间:2016-04-02 17:18:16

标签: sql string postgresql

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

示例:

我有一张桌子

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

我想编写一个查询,以便result包含列o包含的子串name的出现次数。例如,如果在namehello worldresult,则2列应包含o,因为字符串{{1}中有两个hello world }}

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

enter image description here

并更新result列:

enter image description here

我知道函数regexp_matches及其g选项,它表示需要扫描完整的(g =全局)字符串是否存在所有出现的字符串子)。

示例:

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

返回

{o}
{o}

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

返回

2

但是我没有看到如何编写一个UPDATE查询来更新result列,以便它包含列{{1}的子串的出现次数包含。

5 个答案:

答案 0 :(得分:34)

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

(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');

答案 1 :(得分:24)

Postgres这样做的方法是将字符串转换为数组并计算数组的长度(然后减去1):

select array_length(string_to_array(name, 'o'), 1) - 1

请注意,这也适用于较长的子串。

因此:

update test."user"
    set result = array_length(string_to_array(name, 'o'), 1) - 1;

答案 2 :(得分:1)

返回字符数,

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

答案 3 :(得分:0)

其他方式:

UPDATE test."user" SET result = length(regexp_replace(name, '[^o]', '', 'g'));

答案 4 :(得分:0)

Occcurence_Count = LENGTH(REPLACE(string_to_search,string_to_find,'~'))-LENGTH(REPLACE(string_to_search,string_to_find,''))

这个解决方案比我见过的很多,特别是没有除数。 您可以将其转换为函数或在Select中使用 无需变量。 我使用tilde作为替换字符,但是数据集中没有的任何字符都可以使用。