使用表中的列在 PostgreSQL 中创建视图

Posted

技术标签:

【中文标题】使用表中的列在 PostgreSQL 中创建视图【英文标题】:Creating a view in PostgreSQL using columns in a table 【发布时间】: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 列? 【参考方案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;

【讨论】:

谢谢。这比我的简单。

以上是关于使用表中的列在 PostgreSQL 中创建视图的主要内容,如果未能解决你的问题,请参考以下文章

另一个表中的 SQL Server 列在视图中具有静态值

如何在 mySQL 中创建一个空的 VIEW

为啥在 PostgreSQL 中创建生成的列时出现错误?

在 Postgresql 中创建一个数量递增的列

Hibernate LocalDateTime:Postgresql 模式生成在外部 Tomcat 中创建类型为“bytea”的列

SQL查询从postgresql数据库表中具有数组数据类型的列中获取数据。