You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SQL使用Case When Like提取订单饮品对的简化方法咨询

实现方案

核心思路

不需要枚举所有28种组合,你可以先预设7种饮品的集合,通过匹配+分组聚合的方式自动拼接符合条件的饮品对,步骤如下:

  1. 先定义所有7种饮品的集合(根据你给出的示例数据,这里暂列出现身的7种为Beer、Water、Tea、Sprite、Soda、Cola、Wine,你可以根据实际完整列表调整)
  2. 将Food表和饮品集合做关联,匹配出每条订单中包含的2种饮品
  3. 按订单的唯一标识(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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.09 17:18:02