PostgreSQL使用IN查询含重复值列表时如何返回对应重复结果?
解决方案
需求完全可以实现。IN子句本身的作用是条件过滤,只会返回匹配的不重复结果,要保留原始列表的重复次数和顺序,需要先把输入列表构造为有序的临时行集,再和variants表关联查询。
实现思路
- 把你提供的所有变体名称按原始顺序、保留所有重复项,构造为一个带排序标识的临时数据集
- 将临时数据集和
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
相关产品推荐
相关产品推荐

