mysql 计算字符串在VARCHAR字段中出现的次数?

cqoc49vn  于 2023-03-07  发布在  Mysql
关注(0)|答案(8)|浏览(157)

我有这样一张table:
| 职务|描述|
| - ------|- ------|
| 测试1|价值等等价值|
| 测试2|价值测试|
| 测试3|测试测试测试|
| 测试4|价值评价评价评价价值|
我试图弄清楚如何返回字符串在每个DESCRIPTION中出现的次数。
所以,如果我想统计'value'出现的次数,sql语句将返回以下内容:
| 职务|描述|计数|
| - ------|- ------|- ------|
| 测试1|价值等等价值|第二章|
| 测试2|价值测试|1个|
| 测试3|测试测试测试|无|
| 测试4|价值评价评价评价价值|五个|
有什么办法可以做到这一点吗?我根本不想用php,只想用mysql。

krcsximq

krcsximq1#

这应该可以达到目的:

SELECT 
    title,
    description,    
    ROUND (   
        (
            LENGTH(description)
            - LENGTH( REPLACE ( description, "value", "") ) 
        ) / LENGTH("value")        
    ) AS count    
FROM <table>
biswetbf

biswetbf2#

@yannis解决方案的一个更简单、更有效的变体:

SELECT 
    title,
    description,    
    CHAR_LENGTH(description) - CHAR_LENGTH( REPLACE ( description, 'value', '1234') ) 
        AS `count`    
FROM <table>

不同之处在于,我用一个短1个字符的字符串(本例中为“1234”)替换了“value”字符串,这样就不需要进行除法和舍入来得到整数值。
通用版本(适用于每根针串):

SET @needle = 'value';
SELECT 
    description,    
    CHAR_LENGTH(description) - CHAR_LENGTH(REPLACE(description, @needle, SPACE(LENGTH(@needle)-1))) 
        AS `count`    
FROM <table>
41ik7eoe

41ik7eoe3#

试试这个:

select TITLE,
        (length(DESCRIPTION )-length(replace(DESCRIPTION ,'value','')))/5 as COUNT 
  FROM <table>

SQL Fiddle演示

0qx6xfy6

0qx6xfy64#

在SQL SERVER中,这就是答案

Declare @t table(TITLE VARCHAR(100), DESCRIPTION VARCHAR(100))

INSERT INTO @t SELECT 'test1', 'value blah blah value' 
INSERT INTO @t SELECT 'test2','value test' 
INSERT INTO @t SELECT 'test3','test test test' 
INSERT INTO @t SELECT 'test4','valuevaluevaluevaluevalue' 

SELECT TITLE,DESCRIPTION,Count = (LEN(DESCRIPTION) - LEN(REPLACE(DESCRIPTION, 'value', '')))/LEN('value') 

FROM @t
    • 结果**
TITLE   DESCRIPTION               Count
test1   value blah blah value        2
test2   value test                   1
test3   test test test               0
test4   valuevaluevaluevaluevalue    5

我没有安装MySQL,但我发现LEN的等价物是LENGTH,而替换是相同的。
因此,MySql中的等效查询应为

SELECT TITLE,DESCRIPTION, (LENGTH(DESCRIPTION) - LENGTH(REPLACE(DESCRIPTION, 'value', '')))/LENGTH('value') AS Count
FROM <yourTable>

请让我知道它是否也适用于你的MySql。

k10s72fa

k10s72fa5#

这里有一个函数可以做到这一点。

CREATE FUNCTION count_str(haystack TEXT, needle VARCHAR(32))
  RETURNS INTEGER DETERMINISTIC
  BEGIN
    RETURN ROUND((CHAR_LENGTH(haystack) - CHAR_LENGTH(REPLACE(haystack, needle, ""))) / CHAR_LENGTH(needle));
  END;
cotxawn7

cotxawn76#

这是使用空间技术的mysql函数(用mysql 5.0 + 5.5测试):

CREATE FUNCTION count_str( haystack TEXT,  needle VARCHAR(32))
  RETURNS INTEGER DETERMINISTIC
  RETURN LENGTH(haystack) - LENGTH( REPLACE ( haystack, needle, space(char_length(needle)-1)) );
8nuwlpux

8nuwlpux7#

SELECT 
id,
jsondata,    
ROUND (   
    (
        LENGTH(jsondata)
        - LENGTH( REPLACE ( jsondata, "sonal", "") ) 
    ) / LENGTH("sonal")        
)
+
ROUND (   
    (
        LENGTH(jsondata)
        - LENGTH( REPLACE ( jsondata, "khunt", "") ) 
    ) / LENGTH("khunt")        
)
AS count1    FROM test ORDER BY count1 DESC LIMIT 0, 2

谢谢Yannis,你的解决方案为我工作,在这里我分享相同的解决方案,多个关键字与秩序和限制.

oymdgrw7

oymdgrw78#

大多数情况下,这些函数分别为LENGTH和REPLACE(SQL Server用户将使用内置函数LEN而不是LENGTH):
例如,字符串“10,CLARK,MANAGER”中逗号的计数num

select (length('10,CLARK,MANAGER')-
        length(replace('10,CLARK,MANAGER',',','')))/length(',')
as cnt from t1

相关问题