我正在使用PostgreSQL。如果我在中有 ID,请说:
select * from public.record where id in (1,5,1);
这只会给我两行,因为id 1有重复。但是如果我想显示一组包含以下内容的记录呢
id | value
1 | A
5 | B
1 | A
无论我为什么这么做,这可能吗?
答案 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或您选择的任何其他分割器。