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

如何用SQL查询指定公司消息:缺失类型取空company_id记录

解决方案

完全可以用SQL实现这个需求,核心思路是先确保覆盖所有需要的消息类型,再优先选取目标公司的记录,缺失时用company_id为NULL的对应类型记录补充。

实现SQL

WITH required_types AS (
    -- 定义所有需要覆盖的消息类型
    SELECT 'new_contract' AS type UNION ALL
    SELECT 'new_offer' AS type
),
company_records AS (
    -- 获取company_id=1的所有记录
    SELECT * FROM messages WHERE company_id = 1
),
null_records AS (
    -- 获取company_id为NULL的所有记录
    SELECT * FROM messages WHERE company_id IS NULL
)
SELECT
    -- 优先取公司1的id,没有则取NULL记录的id
    COALESCE(c.id, n.id) AS id,
    COALESCE(c.en, n.en) AS en,
    rt.type,
    -- 公司1的记录保留原company_id,补充的记录为NULL
    c.company_id
FROM required_types rt
LEFT JOIN company_records c ON rt.type = c.type
LEFT JOIN null_records n ON rt.type = n.type
WHERE
    -- 确保至少有公司记录或NULL记录存在(根据业务场景可调整)
    (c.id IS NOT NULL OR n.id IS NOT NULL);

逻辑说明

  1. required_types:用UNION ALL生成所有需要覆盖的消息类型列表,确保不会遗漏任何类型。
  2. company_records:筛选出目标公司(company_id=1)的所有记录。
  3. null_records:筛选出company_id为NULL的所有记录。
  4. 主查询通过左连接将类型列表与公司记录、NULL记录关联,用COALESCE函数优先选取公司记录的字段,当公司没有对应类型记录时,自动取NULL记录的对应字段。

测试验证

用你提供的示例数据执行该SQL,会返回:

  • 记录1:id=1, en='new contract', type='new_contract', company_id=1
  • 记录3:id=3, en='new offer', type='new_offer', company_id=NULL
    完全符合期望输出。

内容的提问来源于stack exchange,提问作者Bisher

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 01:15:00