使用 table 中的列在 PostgreSQL 中创建视图
Creating a view in PostgreSQL using columns in a table
在 PostgreSQL 中,我有以下名为 cap_output
的 table 三列:
case_id | libcap | libcap_android |
----------+--------+-----------------
06112301 | 72.6 | 75.6 |
现在我想根据 cap_output
table 中的第 2 和第 3 列创建一个视图。该视图将包含三列。第二列 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
列中 return FALSE (f)
。但它 returned TRUE (t)
。那么为什么我会得到错误的结果?
这表明 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;
您不能在 select 列表中使用 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 中,我有以下名为 cap_output
的 table 三列:
case_id | libcap | libcap_android |
----------+--------+-----------------
06112301 | 72.6 | 75.6 |
现在我想根据 cap_output
table 中的第 2 和第 3 列创建一个视图。该视图将包含三列。第二列 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
列中 return FALSE (f)
。但它 returned TRUE (t)
。那么为什么我会得到错误的结果?
这表明 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;
您不能在 select 列表中使用 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;