0

环境:

我使用 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“更新表”示例,还查看了此处的手册。但是,我还没有找到具有多个条件的更新过程的示例,我相信这是这里需要的。

或者我可能完全错了,解决方案需要 SQL 函数或触发器,有什么提示或建议吗?

4

2 回答 2

5

SQL小提琴

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
于 2013-03-26T17:09:54.857 回答
2

巧合的是,sum 函数具有您正在寻找的行为。您只需要将值转换为行:

UPDATE some_table SET summary = (SELECT SUM(v::int) FROM (VALUES (col1),(col2),(col3),(col4)) as x(v));
于 2013-03-26T17:12:07.933 回答