我有一个PostgreSQL表,其中一些行是脏的,因为在数据输入时,记录的gender
是"未知"虽然它始终保持与object_id
所指示的相同,object_id gender
511E1AC7128EE2E74349896B55461F27 Unknown
511E1AC7128EE2E74349896B55461F27 Unknown
511E1AC7128EE2E74349896B55461F27 Male
56665EA256AB3757CDFA6C1CB4334C91 Female
56665EA256AB3757CDFA6C1CB4334C91 Female
56665EA256AB3757CDFA6C1CB4334C91 Unknown
56665EA256AB3757CDFA6C1CB4334C91 Unknown
55C3BFDBD327396E912604D6E635D59B Unknown
55C3BFDBD327396E912604D6E635D59B Unknown
55C3BFDBD327396E912604D6E635D59B Female
是对象的唯一标识符。
object_id gender
511E1AC7128EE2E74349896B55461F27 Male
511E1AC7128EE2E74349896B55461F27 Male
511E1AC7128EE2E74349896B55461F27 Male
56665EA256AB3757CDFA6C1CB4334C91 Female
56665EA256AB3757CDFA6C1CB4334C91 Female
56665EA256AB3757CDFA6C1CB4334C91 Female
56665EA256AB3757CDFA6C1CB4334C91 Female
55C3BFDBD327396E912604D6E635D59B Female
55C3BFDBD327396E912604D6E635D59B Female
55C3BFDBD327396E912604D6E635D59B Female
因此,我想将我的表更新为:
object_id
其中所有&#34;未知&#34;列被转换为<pre>
/其他条目/中的任何非未知值。有没有办法在PostgreSQL中做到这一点 - 或者 - 甚至更好 - Sequelize(SQL数据库的Javascript ORM?)
答案 0 :(得分:0)
问题不完整所以我假设当前的Postgres版本9.5和此表定义:
CREATE TABLE object (
object_id uuid PRIMARY KEY -- ideally a UUID
, gender text -- could probably be boolean
-- rest irrelevant
);
然后解决方案可以是:
UPDATE object o
SET gender = sub.gender
FROM (
SELECT object_id, min(gender) AS gender
FROM object
GROUP BY 1
) sub
WHERE o.object_id = sub.object_id
AND o.gender IS DISTINCT FROM sub.gender;
您需要子查询,因为UPDATE
中不允许使用聚合或窗口函数。
汇总函数min()
恰好起作用,因为{em>'女性'和'男性'后text
'未知'排序。它也适用于boolean
(其中“未知”为NULL
),min()
和max()
忽略NULL
值。
最后一个WHERE
条件是可选的,但包含它以避免空更新是明智的。如果列定义为o.gender <> sub.gender
;
NOT NULL
为什么使用数据类型uuid
?