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

PostgreSQL使用IN查询含重复值列表时如何返回对应重复结果?

解决方案

需求完全可以实现。IN子句本身的作用是条件过滤,只会返回匹配的不重复结果,要保留原始列表的重复次数和顺序,需要先把输入列表构造为有序的临时行集,再和variants表关联查询。

实现思路

  1. 把你提供的所有变体名称按原始顺序、保留所有重复项,构造为一个带排序标识的临时数据集
  2. 将临时数据集和variants表按name字段关联,即可返回和原始列表重复次数、顺序完全一致的结果

通用兼容写法(适用于所有主流数据库)

用UNION ALL构造临时数据集,同时加排序序号保证顺序不会乱:

SELECT v.id, t.name
FROM (
    -- 按原始列表的顺序依次写,每一行对应列表的一个元素,sort_order按顺序递增
    SELECT 1 AS sort_order, 'XS' AS name UNION ALL
    SELECT 2, 'S' UNION ALL
    SELECT 3, 'M' UNION ALL
    SELECT 4, 'S' UNION ALL
    SELECT 5, 'M' UNION ALL
    -- 此处省略剩余所有条目,按上述格式补全到最后一个值
    SELECT 85, 'Pink Babyhood'
) t
LEFT JOIN variants v ON t.name = v.name
ORDER BY t.sort_order;

说明:如果不需要保留variants表中不存在的名称对应的行,把LEFT JOIN改为INNER JOIN即可。

简化写法(适用于PostgreSQL、MySQL 8.0.19+、SQL Server等支持VALUES行构造的数据库)

SELECT v.id, t.name
FROM (
    VALUES
    (1, 'XS'),
    (2, 'S'),
    (3, 'M'),
    (4, 'S'),
    (5, 'M'),
    -- 补全所有条目
    (85, 'Pink Babyhood')
) AS t(sort_order, name)
LEFT JOIN variants v ON t.name = v.name
ORDER BY t.sort_order;

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 17:24:01