无法更改视图列SQL

时间:2016-04-22 10:13:13

标签: 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;

我在名为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;

如果我将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的新手,对于我的无知感到抱歉,但是当我使用整数列时,它的工作方式非常好,但是当我使用函数返回值时,为什么会中断,我该如何解决?

2 个答案:

答案 0 :(得分:9)

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

  

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

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

答案 1 :(得分:3)

视图是查询的别名。删除它们不会影响您的数据,所以不要担心丢弃它们。要使用,您必须在postgres中更改视图中的列类型时再次删除并创建它。

drop view findPercent;

更改da findIntl函数,然后

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;