如何在PostgreSQL中实现基于查询结果的通用标签统计?
动态匹配标签实现PostgreSQL统计功能
你可以通过LATERAL子查询结合COALESCE函数实现动态标签匹配,替代原来硬编码的CASE逻辑,同时保留原有的匹配优先级规则:
SELECT COALESCE(matching_tag.botag, 'kein Tag') AS Tag, COUNT(bo.id) FROM mdl_booking_options bo JOIN mdl_customfield_data cfd ON cfd.instanceid = bo.id AND cfd.fieldid = 5 LEFT JOIN LATERAL ( SELECT botags AS botag FROM table2 WHERE cfd.value LIKE '%' || botags || '%' -- 复刻原硬编码逻辑的匹配优先级,可根据实际需求调整排序规则 ORDER BY CASE botags WHEN 'TryUSI' THEN 1 WHEN 'Workshop' THEN 2 WHEN 'KOOP' THEN 3 WHEN 'dual' THEN 4 WHEN 'Neu' THEN 5 ELSE 6 END LIMIT 1 ) AS matching_tag ON true WHERE bo.bookingid = 17 GROUP BY COALESCE(matching_tag.botag, 'kein Tag');
关键说明:
LATERAL子查询会为每一条cfd数据单独执行标签匹配,通过LIMIT 1确保只返回第一个符合条件的标签。ORDER BY CASE部分用来还原原硬编码逻辑中的匹配优先级,若不需要固定优先级,直接删除这部分即可。COALESCE函数处理无匹配标签的场景,返回默认值kein Tag。
如果table2中存在重复标签,建议在子查询中添加DISTINCT botags去重,避免重复匹配。
内容的提问来源于stack exchange,提问作者Joachim Hartinger
相关产品推荐
相关产品推荐

