2013-03-26 80 views
0

设置:PostgreSQL的更新列

我使用PostgreSQL 9.1.2,并有一个基本的表格如下,在那里我有4个可以取的值Y或N.这些列中的二进制列也在很大程度上包含空值,这是我表示为“ - ”于下表中:

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函数或触发器,任何提示或建议?

+0

你是什么意思的二进制列?它的类型是什么? – 2013-03-26 16:58:24

回答

4

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 
+0

谢谢,我在问题的标签中加入了“coalesce”。 – Rhubarb 2013-03-27 16:01:19

1

作为一个令人高兴的巧合,总和功能完全相同的行为,你正在寻找。你只需要将值转换成行:

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

你能否解释一下逻辑? – harry 2013-08-21 07:29:59

+0

4列被扩展为4行的单列关系,布尔值被转换为int,false成为0,true成为1,然后求和值以返回所需的结果。这取决于SQL sum聚合的行为,该行为定义为跳过空值,并在所有聚合值为空时返回null。 – 2013-08-28 02:16:45