【问题标题】:PostgreSQL Update Column based on Multiple Conditions基于多个条件的 PostgreSQL 更新列
【发布时间】:2013-03-26 16:40:15
【问题描述】:

设置:

我使用 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 函数或触发器,有什么提示或建议吗?

【问题讨论】:

  • 二进制列是什么意思?它的类型是什么?

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


【解决方案1】:

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

【讨论】:

  • 谢谢,我在问题的标签中添加了“coalesce”。
【解决方案2】:

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

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

【讨论】:

  • 你能解释一下逻辑吗?
  • 将4列扩展为4行的单列关系,布尔值转换为int,false变为0,true变为1,然后将这些值相加返回所需的结果。这依赖于 SQL sum 聚合的行为,该行为被定义为在所有聚合值为 null 时跳过 null 并返回 null。
猜你喜欢
  • 2018-09-08
  • 2021-11-16
  • 2021-11-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-27
  • 2015-01-10
  • 1970-01-01
相关资源
最近更新 更多