如何删除条件为postgres的行



我有一个postgres表,有多个行,有一个共同的项目。如果表上的行为真或为空,我如何删除该行?

jason@gmail.com jason@gmail.combenita@outlook.combenita@outlook.com

使用窗口函数选择要保留的行

ORDER BY选择true而不是none,因此如果两者都存在,则选择经过验证的电子邮件作为行号1。,第二个排序列是id,如果存在两个或多个相等的电子邮件,它将获得最低的id。

但是你应该重新设计你的表格和邮件,这样就不能插入多个相同的邮件

CREATE TABLE tab1
("id" int, "email" varchar(18), "verified" varchar(4))
;

INSERT INTO tab1
("id", "email", "verified")
VALUES
(1, 'jason@gmail.com', 'true'),
(2, 'jason@gmail.com', 'none'),
(3, 'benita@outlook.com', 'none'),
(4, 'benita@outlook.com', 'none')
;
DELETE FROM tab1
WHERE "id" IN 
(SELECT "id"
FROM (SELECT "id"
, ROW_NUMBER() OVER (PARTITION BY "email" ORDER BY "verified" DESC, "id") rn FROM tab1) t1
WHERE rn > 1)
2行受影响
SELECt * FROM tab1
id | email |已验证—:|:----------------- |:-------1 | jason@gmail.com |真3 | benita@outlook.com | none

db<此处小提琴>

最新更新