使用表中的列在 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
将是libcap
和libcap_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 中创建视图的主要内容,如果未能解决你的问题,请参考以下文章
Hibernate LocalDateTime:Postgresql 模式生成在外部 Tomcat 中创建类型为“bytea”的列