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;