我是否需要使用函数迭代唯一记录以进行批量更新?

时间:2011-06-22 14:24:50

标签: sql postgresql sql-update loops

运行Postgres 7.4(是的,我们正在升级),我有一个表,如果该字段有值,我们将三个字段合并到一个新字段中。

示例数据:

record_id | old_field_1 | old_field_2 | old_field_3 | new_field
+---------+-------------+-------------+-------------+----------+
12345     | blah        | foo         |             |            <-- new_field = foo
12346     |             |             | what        |            <-- new_field = what
12347     |             |             |             |            <-- new_field IS NULL
12348     | hello       |             |             |            <-- new_field = hello

所以这适用于以下一条记录:

UPDATE db_table
SET new_field = CASE 
    WHEN old_field_3 IS NOT NULL THEN old_field_3
    WHEN old_field_2 IS NOT NULL THEN old_field_2
    WHEN old_field_1 IS NOT NULL THEN old_field_1
    ELSE new_field
END
WHERE record_id = 123456

接下来的记录是

UPDATE db_table
SET new_field = CASE 
    WHEN old_field_3 IS NOT NULL THEN old_field_3
    WHEN old_field_2 IS NOT NULL THEN old_field_2
    WHEN old_field_1 IS NOT NULL THEN old_field_1
    ELSE new_field
END
WHERE record_id = 123457

old_field_#(1,2,3)都是不同的值。如果old_field_3 IS NOT NULL,则将此值用于new_field,否则检查下一个值。但是每条记录都有自己独特的值,需要更新

但我想迭代数据库中的所有记录。

尝试FOR循环但语法或正确用法我没有正确实现。在尝试执行UPDATE语法之前尝试使SELECT工作,但遇到一些问题。

FOR a_record IN SELECT * FROM db_table LOOP
    RAISE NOTICE 'record_id - %', a_record.record_id;
    RAISE NOTICE 'old_field_1     - %', a_record.old_field_1; 
END LOOP;

我错过了什么?

1 个答案:

答案 0 :(得分:3)

如果我理解正确,如果你想对表中的所有记录进行这种组合,只需从你的查询中删除你的where子句。