PostgreSQL中使用WHERE IN子句时如何保留重复ID对应的行
PostgreSQL中保留IN子句重复ID对应的查询结果行
当使用WHERE id IN (list)时,PostgreSQL只会返回原表中匹配ID的唯一行——因为IN的逻辑是判断"id是否存在于列表中",不管列表里重复多少次,只要原表对应ID只有一行,就只会返回一次。
要让重复ID对应的行也重复出现在结果里,直接用IN做不到,但可以用以下两种PostgreSQL原生方法实现:
方法一:使用VALUES子句+JOIN(推荐)
通过VALUES子句构建包含重复ID的临时数据集,再和原表做JOIN,这样每个重复的ID都会匹配一次原表数据,得到重复的结果行:
SELECT t.* FROM your_table t JOIN (VALUES (102), (103), (103), (104)) AS v(id) ON t.id = v.id;
这种方法适合ID列表较长的场景,写法简洁易维护。
方法二:使用UNION ALL拼接查询
对每个ID单独写SELECT语句,用UNION ALL(注意不是UNION,UNION会自动去重)拼接结果:
SELECT * FROM your_table WHERE id = 102 UNION ALL SELECT * FROM your_table WHERE id = 103 UNION ALL SELECT * FROM your_table WHERE id = 103 UNION ALL SELECT * FROM your_table WHERE id = 104;
这种方法逻辑直观,但ID数量多的时候代码会比较冗长。
内容的提问来源于stack exchange,提问作者LVerwolf
相关产品推荐
相关产品推荐

