jason@gmail.com
jason@gmail.combenita@outlook.combenita@outlook.com
我有一个postgres表,有多个行,有一个共同的项目。如果表上的行为真或为空,我如何删除该行?
使用窗口函数选择要保留的行
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<此处小提琴>此处小提琴>