即使重复,也可以在ID IN查询中检索相同数量的记录

时间:2016-04-26 07:05:35

标签: sql postgresql duplicates

我正在使用PostgreSQL。如果我在中有 ID,请说:

select * from public.record where id in (1,5,1);

这只会给我两行,因为id 1有重复。但是如果我想显示一组包含以下内容的记录呢

id | value
1  |   A
5  |   B
1  |   A

无论我为什么这么做,这可能吗?

3 个答案:

答案 0 :(得分:2)

您可以通过加入值来实现:

with ids (id) as (
  values (1),(5),(1)
) 
select r.*
from public.record r
  join ids on r.id = ids.id;

如果您需要保留参数列表的顺序,则需要添加一列以进行排序:

with ids (id, sort_order) as (
  values 
      (1, 1),
      (5, 2),
      (1, 1)
) 
select r.*
from public.record r
  join ids on r.id = ids.id
order by ids.sort_order;

答案 1 :(得分:1)

您可以在子查询上使用JOIN

SELECT
    r.id, r.value
FROM public.record r
INNER JOIN (
    SELECT 1 AS id UNION ALL
    SELECT 5 AS id UNION ALL
    SELECT 1 AS id
) t
    ON t.id = r.id

答案 2 :(得分:0)

如果要求结果集中的所有行(1,5,1)包括不匹配的public.record,则使用OUTER join

with c(id) as (
  values (1),(5),(1)
) 
select r.*
from c  
left join public.record pr
on pr.id = c.id;

修改
如果输入是一个字符串类型'1,5,1'sql注入安全代码应该使用它作为参数,而不是代码。

declare @prm varchar(1000) ='1,5,1'; 

select r.*
from  DelimitedSplit8K(@prm) c 
left join public.record pr
on pr.id = cast(c.item as int);

DelimitedSplit8K是Jeff Moden的功能(MS SQL)https://msdn.microsoft.com/en-us/library/windows/desktop/aa394173(v=vs.85).aspx或您选择的任何其他分割器。