SQL使用Case When Like提取订单饮品对的简化方法咨询
实现方案
核心思路
不需要枚举所有28种组合,你可以先预设7种饮品的集合,通过匹配+分组聚合的方式自动拼接符合条件的饮品对,步骤如下:
- 先定义所有7种饮品的集合(根据你给出的示例数据,这里暂列出现身的7种为
Beer、Water、Tea、Sprite、Soda、Cola、Wine,你可以根据实际完整列表调整) - 将
Food表和饮品集合做关联,匹配出每条订单中包含的2种饮品 - 按订单的唯一标识(Order ID)分组,将匹配到的2种饮品拼接为字符串即可
代码实现
以下是通用SQL写法,不同数据库可根据自身字符串函数微调:
WITH drinks AS ( -- 这里放入所有7种饮品的完整列表 SELECT 'Beer' AS drink_name UNION ALL SELECT 'Water' AS drink_name UNION ALL SELECT 'Tea' AS drink_name UNION ALL SELECT 'Sprite' AS drink_name UNION ALL SELECT 'Soda' AS drink_name UNION ALL SELECT 'Cola' AS drink_name UNION ALL SELECT 'Wine' AS drink_name ) SELECT f.OrderDate, f.`Order ID`, f.`Cafe Name`, GROUP_CONCAT(d.drink_name SEPARATOR ' - ') AS Drink FROM Food f JOIN drinks d ON f.Text LIKE CONCAT('%', d.drink_name, '%') GROUP BY f.OrderDate, f.`Order ID`, f.`Cafe Name`
补充说明
- 如果你的数据库不支持CTE(WITH子句),可以把drinks部分换成临时表或者实体饮品表
- 如果需要固定饮品的拼接顺序(比如永远把字母顺序靠前的放前面),可以在GROUP_CONCAT里加ORDER BY子句:
GROUP_CONCAT(d.drink_name ORDER BY d.drink_name SEPARATOR ' - ') - 为了避免短饮品名匹配到长名称的误判(比如如果有
Tea和Ice Tea的情况),可以调整匹配逻辑,比如先把Text字段的逗号前后加空格再匹配CONCAT('% ', d.drink_name, ' %'),或者用正则匹配单词边界
内容的提问来源于stack exchange,提问作者Osman Büyükyılmaz
相关产品推荐
相关产品推荐

