postgresql 在Postgres中将一行的优先级设置为高于另一行

6za6bjd0  于 2023-02-08  发布在  PostgreSQL
关注(0)|答案(2)|浏览(150)

DB-Fiddle

create table items (
  name varchar(15) not null,
  id1 integer,
  id2 integer,
  UNIQUE(id1),
  UNIQUE(id2)
);

insert into items (name, id1, id2) values 
('a', 1, null),
('b', 2, null),
('c', null, 2);

select * from items where id1=2
union
select * from items where id2=2
and id2 not in (select id2 from items where id1=2);

我有一个表,其中有多个字段包含属于给定项的唯一ID。在我的示例中,id1id2包含此值。我的目标是,如果无法通过id1找到项,则仅依赖id2。因此,在我的示例中,我希望总是返回b
我已经设法通过一个联盟来实现这个功能,但是这看起来是一个非常笨拙的解决方案,而且性能很差。在我看来,一个更好的解决方案是在客户端进行过滤。你觉得呢?

zzzyeukh

zzzyeukh1#

我们可以在这里使用ROW_NUMBER

WITH cte AS (
    SELECT *, ROW_NUMBER() OVER (PARTITION BY COALESCE(id1, id2) ORDER BY id1) rn
    FROM items
)

SELECT name, id1, id2
FROM cte
WHERE rn = 1;

每个逻辑记录对都用COALESCE(id1, id2)来描述(如果存在记录对的话),在每个记录对中,我们选择具有 * 最小 * id1值的记录,这意味着非空记录。

xyhw6mcr

xyhw6mcr2#

我会用

SELECT *
FROM (SELECT * FROM items WHERE id1 = 2
      UNION ALL
      SELECT * FROM items WHERE id1 = 2) AS q
ORDER BY id2 IS NULL
FETCH FIRST 1 ROWS ONLY;

这依赖于FALSE < TRUE.

相关问题