【问题标题】:How to use CTE's for multiplication of columns如何使用 CTE 进行列的乘法运算
【发布时间】:2019-06-22 14:35:24
【问题描述】:

我正在尝试将 column1 乘以 column2;基于column2中是否有值。如果 column2 中有值,则答案将放在 column3 中。我正在尝试使用 WITH 和公用表表达式。

我搜遍了论坛,好像没有类似的CTE问题。

WITH cte_apfc AS(
    SELECT SUM(CAST("column1" AS numeric(4,2))) * SUM(CAST("column2" AS numeric(4,2)))
    FROM table1
    )

    UPDATE table1
    SET "column3" = cte_apfc
    FROM cte_apfc
    WHERE "column2" IS NOT NULL;

这是我目前收到的错误,我不确定如何解决。

错误:列“column3”是数字类型,但表达式是记录类型 第 13 行:SET "column3" = cte_apfc ^ 提示:您需要重写或强制转换表达式。

【问题讨论】:

  • 为什么要转换成数字?这些列不是定义为数字还是整数吗?
  • 感谢您提出质疑 - 您帮助我找到了正确的解决方案。它是如此简单,让我大吃一惊:D

标签: postgresql


【解决方案1】:

哇,我把它复杂化了。我不需要使用 CAST,因为列已经是数字了(谢谢 horse_with_no_name)。

解决方案非常简单......

UPDATE table1
SET "column3" = "column1" * "column2"
WHERE "column2" IS NOT NULL;

【讨论】:

    【解决方案2】:

    不能引用 CTE 的别名,需要引用列。为此,您需要定义一个列别名:

    WITH cte_apfc AS(
      SELECT SUM(CAST("column1" AS numeric(4,2))) * SUM(CAST("column2" AS numeric(4,2))) as value
      FROM table1
    )
    UPDATE table1
       SET "column3" = c.value
    FROM cte_apfc c
    WHERE "column2" IS NOT NULL;
    

    您可能还希望在查询中使用 WHERE "column2" IS NOT NULL 来将值相乘。


    请注意,您实际上并不需要 CTE:

    UPDATE table1
       SET "column3" = (SELECT SUM(CAST("column1" AS numeric(4,2))) * SUM(CAST("column2" AS numeric(4,2)))
                        FROM table1)
    WHERE "column2" IS NOT NULL;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-07
      • 1970-01-01
      • 1970-01-01
      • 2011-04-12
      • 1970-01-01
      相关资源
      最近更新 更多