【问题标题】:Creating a view in PostgreSQL using columns in a table使用表中的列在 PostgreSQL 中创建视图
【发布时间】:2015-08-10 18:29:44
【问题描述】:

在 PostgreSQL 中,我有一个名为 cap_output 的三列​​表格:

 case_id  | libcap | libcap_android | 
----------+--------+-----------------
 06112301 |   72.6 |           75.6 |

现在我想根据cap_output 表中的第二列和第三列创建一个视图。该视图将包含三列。第二列diff 将是libcaplibcap_android 之间的差异。如果diff 的绝对值小于0.5,第三列将为TRUE,否则为FALSE。所以我使用下面的语句来创建视图

CREATE VIEW score_diff AS 
    SELECT c.case_id, 
    c.libcap - c.libcap_android AS diff, 
    (CASE WHEN abs(diff) < 0.5 THEN TRUE ELSE FALSE END) AS pass
    FROM cap_output AS c;

但是创建这个视图之后,当我查询视图score_diff时,我得到了如下结果

 case_id  | diff | pass 
----------+------+------
 06112301 |   -3 | t

显然,差异是-3,它应该在视图的pass 列中返回FALSE (f)。但它返回了TRUE (t)。那么为什么我会得到错误的结果呢?

【问题讨论】:

  • 一般来说,你不能在定义它的同一个字段列表中使用别名。正如你所写的那样,你的视图定义应该因语法错误而死。
  • @MarcB 我执行了CREATE 查询,但没有任何语法错误消息(第 9.4 页)。那么如何在 Postgres 的 pass 列中引用第二个 diff 列?

标签: sql postgresql view


【解决方案1】:

这表明cap_output 有一个名为diff 的列。正如 Marc 指出的那样,视图会出现语法错误。

所以,重复一下逻辑:

CREATE VIEW score_diff AS 
    SELECT c.case_id, 
           (c.libcap - c.libcap_android) AS diff, 
           (CASE WHEN abs(c.libcap - c.libcap_android) < 0.5 THEN TRUE ELSE FALSE END) AS pass
    FROM cap_output AS c;

【讨论】:

  • 这确实是问题的原因。我在表cap_output 中有一个列diff(只是在我原来的问题中省略了它,认为它无关紧要)。
【解决方案2】:

您不能在选择列表中使用diff。此外,case 不是必需的。试试这个:

CREATE VIEW score_diff AS 
    SELECT c.case_id, 
    c.libcap - c.libcap_android AS diff, 
    abs(c.libcap - c.libcap_android) < 0.5 AS pass
    FROM cap_output AS c;

【讨论】:

  • 谢谢。这比我的简单。
猜你喜欢
  • 2021-08-15
  • 2021-08-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-04
  • 2019-02-28
相关资源
最近更新 更多