如何计算PostgreSQL中字符串中子字符串的出现次数?
示例:
我有一张桌子
CREATE TABLE test."user"
(
uid integer NOT NULL,
name text,
result integer,
CONSTRAINT pkey PRIMARY KEY (uid)
)
我想编写一个查询,以便result
包含列o
包含的子串name
的出现次数。例如,如果在name
中hello world
为result
,则2
列应包含o
,因为字符串{{1}中有两个hello world
}}
换句话说,我正在尝试编写一个可作为输入的查询:
并更新result
列:
我知道函数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}的子串的出现次数包含。
答案 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作为替换字符,但是数据集中没有的任何字符都可以使用。