无法更改视图列SQL的数据类型

Naj*_*med 7 sql postgresql

我一直收到这个错误

无法将视图列"百分比"的数据类型从整数更改为双精度

我有一个函数调用findIntl()它返回一个浮点数

create or replace function findIntl(integer) returns float as $$
  select cast(count(*) as float)
  from students s
  join program_enrolments pe on (s.id = pe.student)
  where s.stype = 'intl' and pe.semester = $1;
$$ language sql;
Run Code Online (Sandbox Code Playgroud)

我在名为findPercent的视图中使用返回的值

create or replace view findPercent(semester, percent) as
  select q6(s.id), findIntl(s.id)
  from semesters s
  where s.id = id and s.term ~ 'S' and s.year >= 2004;
Run Code Online (Sandbox Code Playgroud)

如果我findIntl()用另一列值替换它完全正常,但findIntl()它什么时候会说cannot change data type of view column "percent" from integer to double precision

如果我cast(findIntl(s.id) as numeric(4,2)说的话

错误:无法将视图列"百分比"的数据类型从整数更改为数字(4,2)

我已经阅读了有关删除表的事情的stackoverflow,但我不太明白为什么我必须这样做,我甚至不确定它是否适用于这种情况.

另外,如果我从findPercent中删除学期,只保留百分比,select findIntl(s.id)然后才会说

错误:无法从视图中删除列

我是SQL的新手,对于我的无知感到抱歉,但是当我使用一列整数时它工作得非常好,但是当我使用函数返回值时,为什么会中断,我该如何解决?

Gor*_*off 12

我认为Postgres 文档非常清楚使用替换视图:

CREATE OR REPLACE VIEW类似,但如果已存在同名视图,则替换它.新查询必须生成由现有视图查询生成的相同列(即,相同顺序且具有相同数据类型的相同列名),但它可能会在列表末尾添加其他列.产生输出列的计算可能完全不同.

您需要删除视图并重新创建它.


All*_*rao 5

视图是查询的别名。删除它们不会影响您的数据,因此不必担心删除它们。要工作,必须在postgres的视图中更改列类型时再次拖放并创建它。

drop view findPercent;
Run Code Online (Sandbox Code Playgroud)

更改find​​Intl函数,然后

create or replace view findPercent(semester, percent) as
select q6(s.id), findIntl(s.id)
from semesters s
where s.id = id and s.term ~ 'S' and s.year >= 2004;
Run Code Online (Sandbox Code Playgroud)

  • 删除视图不会更改数据,但是,如果您有嵌套视图(使用视图的视图),则灵活性受到很大限制,因为删除视图必须级联。 (2认同)