如何将行数计入 Postgres 搜索的 case 表达式的多个 'then'? (报告)

How can I count rows into more than one 'then' of a Postgres searched case expression? (reporting)

背景

我在 RDS 上有一个 Postgres 11 数据库 运行。我需要生成一份报告,显示特定时期内的事件计数,根据业务需求根据描述字符串对事件进行分组、重命名和计数。

问题 对于这类事情,我通常会使用搜索式 case 表达式,它运行良好 except: 部分规范要求 一些 事件必须计入多个类别。但是当评估 case 表达式时,它会将每一行计数 [或似乎计数] 到一个类别 [表达式中第一个匹配的]。

示例:

     SELECT 
          CASE 
            WHEN (some_table.description ILIKE '%foo%' OR some_table.description ILIKE ‘%foobar%') THEN 'foo' 
            WHEN (some_table.description ILIKE '%bar%' OR some_table.description ILIKE ‘%foobar%) THEN 'bar'
          END AS ‘category’,
          count(*)
    FROM some_table 
    GROUP BY category
    ORDER BY category DESC
    ;

因此,给定

这样的数据

event_id         |   description
---------------------------------
1                |    ‘string including foo’
2                |   ‘foo also included in this string’
3                |   ‘ this string includes bar’
4                |   ‘this one says foobar’

预期输出如下:

some_table
category         |      count
---------------------------------
foo              |    3
bar              |    2

但是,实际输出返回为

some_table
category         |      count
---------------------------------
foo              |    3
bar              |    1  

如何让描述包含“foobar”的记录同时计入“foo”和“bar”类别?如果案例表达式对于这个报告目标来说是错误的方法,那么应该使用什么?所有指导表示赞赏!

输出在第一个匹配处停止。如果两者都需要,请使用横向连接:

SELECT v.category, COUNT(*)
FROM some_table t CROSS JOIN LATERAL
     (VALUES (CASE WHEN s.description ILIKE '%foo%' OR s.description ILIKE '%foobar%' THEN 'foo' END),
             (CASE WHEN s.description ILIKE '%bar%' OR s.description ILIKE '%foobar% THEN 'bar' END)
     ) v(category)
WHERE v.category IS NOT NULL
GROUP BY v.category
ORDER BY v.category DESC
;