PostgreSQL View中不存在列

时间:2015-06-30 02:12:51

标签: postgresql postgresql-9.1 postgresql-9.2 postgresql-9.3

我有以下情况,但我不知道我的代码有什么问题。我收到此错误:列vx1不存在(vx1不是列的变量)。

    vx1 double precision;
    vy1 double precision;
    vz1 double precision;
    vx2 double precision;
    vy2 double precision;
    vz2 double precision;
begin
    vx1 := x1;
    vy1 := y1;
    vz1 := z1;
    vx2 := x2;
    vy2 := y2;
    vz2 := z2;

    create view "shortestpathEdges" as
    select *
    from tbledges te
    where te.x<=vx1 and te.y<=vy1 and te.z<=vz1 and 
          te.x<=vx2 and te.y<=vy2 and te.z<=vz2;

这是完整的功能,但它会让你感觉不舒服,所以我觉得很简单,因为还有错误。

create temp view shortestpathEdges as
select *
from(select x , y, z, vid   
     from(select tv.x as x,tv.y as y,tv.z as z,tv."VertexID" as vid
      from (select te."EdgeID" edgeid, te."VertexID" vertexid
        from tbledges te
        where te.status='dual')as t1, tblvertices as tv
      where t1.vertexid=tv."VertexID") as tv2
     where tv2.x<=vx1 and tv2.y<=vy1 and tv2.z<=vz1 and 
         tv2.x<=vx2 and tv2.y<=vy2 and tv2.z<=vz2) as tv3, tbledges as tble
where tv3.vid=tble."VertexID";

1 个答案:

答案 0 :(得分:1)

PL / Pgsql帮助文档的Variable Substitution部分提到了答案(可以说是隐密的)。

  

变量替换目前仅适用于SELECT,INSERT,UPDATE,   和DELETE命令,因为主SQL引擎允许查询   参数仅在这些命令中。使用非常量名称或值   在其他语句类型(通常称为实用程序语句)中,您   必须将实用程序语句构造为字符串并执行它。

这意味着PL / Pgsql中的变量替换不会发生在DDL命令上(尚未)。

为此,您应该使用EXECUTE语句(该链接包含有关如何构建变量sql_string的示例,该变量可以通过EXECUTE sql_string;简单地运行)