计算SQL中的多个CASE出现次数

Kad*_*del 9 mysql sql

我正在寻找以下问题的解决方案:

SELECT CASE WHEN p.value LIKE '%foo%' THEN 'foos'
    WHEN p.value LIKE '%bar%' THEN 'bars'
    WHEN p.value LIKE '%bakar%' THEN 'bakars'
    ELSE p.value END as value,
COUNT(*) as count FROM table_a p GROUP BY value
Run Code Online (Sandbox Code Playgroud)

值类似于:

foo, bar, foo and bar, bakar, bakarbar, foobar
Run Code Online (Sandbox Code Playgroud)

此查询的结果是:

 value    count
 foos       3
 bars       2
 bakars     1
Run Code Online (Sandbox Code Playgroud)

此代码成功计算出现次数,但CASE在第一次匹配时停止.有没有办法做到这一点?

value    count
 foos       3
 bars       4
 bakars     2
Run Code Online (Sandbox Code Playgroud)

sag*_*agi 5

UNION如果要在每个字符串中计数不止一次,则可以使用:

SELECT 'foos' as value, count(*)
FROM YourTable
WHERE p.value LIKE '%foo%'
UNION ALL
SELECT 'bars' as value, count(*)
FROM YourTable
WHERE p.value LIKE '%bar%'
UNION ALL
SELECT 'bakars' as value, count(*)
FROM YourTable
WHERE p.value LIKE '%bakar%'
Run Code Online (Sandbox Code Playgroud)


Sha*_*dow 4

在单个case表达式 no 中,您无法精确地实现您想要的结果,因为case在第一个匹配处停止。

您需要有单独的case表达式或if()函数调用才能实现预期结果。如果您不介意将结果放在不同的列中,则可以使用条件计数:

select count(if(p.value LIKE '%foo%',1,null)) as foos,
       ...
from table_a p
Run Code Online (Sandbox Code Playgroud)

如果您坚持在同一列中接收计数,请使用union

select 'foos' as `value`, count(*) from table_a where table_a.value LIKE '%foo%'
union
...
Run Code Online (Sandbox Code Playgroud)