基于多个条件的PostgreSQL更新列

时间:2013-03-26 16:40:15

标签: postgresql sql-update case postgresql-9.1 coalesce

环境:

我使用PostgreSQL 9.1.2并有一个基本表,如下所示,我有4个二进制列,可以采用值Y或N.这些列也主要包含Null值,我在其中表示为' - '下表:

    Binary Col 1   Binary Col 2   Binary Col 3   Binary Col 4   Summary Col
    ------------   ------------   ------------   ------------   -----------
1.       Y             N               -             N               1
2.       -             Y               N             Y               2
3.       N             N               -             N               0
4.       -             -               -             -               -
5.       Y             Y               Y             Y               4         

问题:

我想在我的表中包含一个汇总列,该表根据这4个二进制列中出现的'Y'的数量填充。我在上表中给出了5个示例条目来展示所需的输出。需要注意的一件重要事情是,我希望能够区分条目3(没有'Y'观察到)和条目4之类的情况(所有二进制列都为空)。这是一次性工作,我没有关于这个重复列如何影响我的表的事务速度的性能问题。

我查看了很多PostgreSQL“更新表”示例,并查看了手册here。但是,我找不到具有多个条件的更新过程的示例,我相信这是必需的。

或者可能是我完全错了,解决方案需要SQL函数或触发器,任何提示或建议?

2 个答案:

答案 0 :(得分:5)

SQL Fiddle

select
    c1, c2, c3, c4,
        (coalesce(c1, '') = 'Y')::integer
        + (coalesce(c2, '') = 'Y')::integer
        + (coalesce(c3, '') = 'Y')::integer
        + (coalesce(c4, '') = 'Y')::integer
    total_Y,
        (c1 is null)::integer
        + (c2 is null)::integer
        + (c3 is null)::integer
        + (c4 is null)::integer
    total_null
from t

答案 1 :(得分:2)

作为一个幸福的巧合,sum函数具有您正在寻找的行为。您只需将值转换为行:

UPDATE some_table SET summary = (SELECT SUM(v::int) FROM (VALUES (col1),(col2),(col3),(col4)) as x(v));