MySQL多字符串出现在字符串中

MySQL多字符串出现在字符串中,mysql,sql,Mysql,Sql,我有这样的桌子: ----------- ID | Value ----------- 1 | AAAA 2 | ABCD 3 | AADC 4 | ABBD ------------------- ID | Value | Count ------------------- 1 | AAAA | 0 2 | ABCD | 1 3 | AADC | 0 4 | ABBD | 2 5

我有这样的桌子:

-----------
ID | Value
-----------
1  | AAAA
2  | ABCD
3  | AADC
4  | ABBD
    -------------------
    ID | Value | Count
    ------------------- 
    1  | AAAA  |   0 
    2  | ABCD  |   1 
    3  | AADC  |   0 
    4  | ABBD  |   2 
    5  | ABBB  |   3 
    6  | AABB  |   3 
    7  | AAAB  |   3
    8  | AABC  |   2
    9  | DBCA  |   1
   10  | CBAA  |   2
   11  | BDAB  |   2
我试图找出如何返回字符串在每个值中出现的次数

因此,如果我想计算“A”和“B”出现的时间,sql语句将如下返回:

-----------
ID | Value
-----------
1  | AAAA
2  | ABCD
3  | AADC
4  | ABBD
    -------------------
    ID | Value | Count
    ------------------- 
    1  | AAAA  |   0 
    2  | ABCD  |   1 
    3  | AADC  |   0 
    4  | ABBD  |   2 
    5  | ABBB  |   3 
    6  | AABB  |   3 
    7  | AAAB  |   3
    8  | AABC  |   2
    9  | DBCA  |   1
   10  | CBAA  |   2
   11  | BDAB  |   2
示例:值是“ACBB”,我要搜索的字符是“A”和“B”。结果是2。首先我们搜索“A”和“B”。当我们替换第一个“A”和“B”时,值将为“CB”(“C”和“B”),计数器将为1。如果还有一个“A”或“B”,则为计数。所以这个例子的计数器是2,因为有一个“B”。如果有2个“B”,则结果为3


有没有办法做到这一点?我不想使用php、vb等。我在Oracle中尝试过MySQL,希望它也能在MySQL中使用:

select value,
  case when value not like '%A%' or value not like '%B%' THEN 0
  else (LENGTH(value) - LENGTH(REPLACE(value, 'A', '')) +  LENGTH(value) - LENGTH(REPLACE(value, 'B', '')) - 1)
  end case from test;

当然,如果您的表有不同的名称,您必须在查询中更改它。

首先,该值必须与“a”和“B”匹配。如果有其他值“A”或“B”匹配,则它将计数。因此,步骤是(A和B),(A或B),(A或B)=3@Leandro的可能副本。它不是复制品。检查第6行的计数
AABB=3
。它不仅仅是计算某个特定字符的出现次数。这里有很好的逻辑+我要搜索的问题a和B不是字符串(“AB”),而是两个字符“a”和“B”。根据你的回答,当值是AAAA时,计数器是3。第一条规则是,该值必须包含我要搜索的2个字符('A'和'B'),无论其位置在何处。如果它不包含我要搜索的字符之一,则计数器为零。我们还需要将结果数字除以
针长度
,因为针字符串长度大于1时,它无法正常工作character@Slocky对不起,在这种情况下,我误解了你的问题。另一部分:AAAA在Oracle中返回0,这在MySQL中应该是一样的。我对我的答案做了一些编辑。第一种情况下的条件已更改,现在它可以确保无论A、B是否缺失,都得到0。我在inOracle中测试了它,并给出了您在上面的示例中编写的值。请在MySQL中尝试,因为我不能。值字符串中的每个字符位置都可以是随机的(“DACB”、“BCDA”等)。它并不总是“AB”。。
SELECT ID, Value,    
  CASE 
   WHEN ROUND (( LENGTH(Value) - LENGTH( REPLACE ( Value, "AB", ""))) / LENGTH("AB")) = 0 THEN 0
   WHEN ROUND (( LENGTH(Value) - LENGTH( REPLACE ( Value, "AB", ""))) / LENGTH("AB")) = 1 THEN
   (ROUND (( LENGTH(Value) - LENGTH( REPLACE ( Value, "A", ""))) / LENGTH("A"))  +
   (ROUND (( LENGTH(Value) - LENGTH( REPLACE ( Value, "B", ""))) / LENGTH("B")) - 1
 END
AS Count    
FROM tablename;