查找MYSQL中特定字符串的出现次数

时间:2012-02-27 11:27:30

标签: mysql

考虑字符串"55,33,255,66,55"

我正在寻找使用mysql select query计算此字符串中特定字符(本例中为“55”)的出现次数的方法。

目前我使用以下逻辑来计算

 
select CAST((LENGTH("55,33,255,66,55") - LENGTH(REPLACE("55,33,255,66,55", "55", ""))) / LENGTH("55") AS UNSIGNED)
 

但是这个问题是,它计算所有出现的55并且结果是= 3 , 但是所需的输出是= 2.

有什么方法可以让这项工作正确吗?请建议。

注意:“55”是我们提供的输入,并认为值“55,33,255,66,55”来自数据库字段。

此致

巴兰

3 个答案:

答案 0 :(得分:6)

你希望在',55,'上匹配,但是要担心的是第一个也是最后一个位置。你可以使用在输入的frot和back后面添加逗号的技巧来解决这个问题:

select LENGTH('55,33,255,66,55') + 2 -
    LENGTH(REPLACE(CONCAT(',', '55,33,255,66,55', ','), ',55,', 'xxx'))

返回2

我已经使用CONCAT预先和后挂逗号(而不是在文本中添加文字),因为我假设您将在不是文字的列上使用它。

还要注意这些改进:

  • 删除演员表 - 它已经是数字
  • 用长度较短的字符串替换(即',55,'长度4到'xxx'长度3),结果不需要分割 - 它已经是正确的结果
  • 2被添加到长度中,因为正面和背面添加了两个逗号(无需使用CONCAT来计算预替换长度)

答案 1 :(得分:0)

我会在这个子选择中做一个子选择我会用其他一些独特的标志替换每一个255,并且他们会计算新的标志和55的位置。

If(row = '255') then '1337'

例如。

答案 2 :(得分:0)

试试这个:

select CAST((LENGTH("55,33,255,66,55") + 2 - LENGTH(REPLACE(concat(",","55,33,255,66,55",","), ",55,", ",,"))) / LENGTH("55") AS UNSIGNED)