使用Postgresql中的表别名访问记录中的列

时间:2013-02-06 12:56:21

标签: postgresql

我正在尝试使用记录数据类型迭代查询结果。不过,如果我尝试使用查询中定义的表别名访问一列,我会收到以下错误:

  

ERRO:架构“inv_row”不存在   语境:SQL命令“SELECT inv_row.s.processor<> inv_row.d.processor”   PL / pgSQL函数“teste”第7行在IF

以下是抛出此错误的代码:

CREATE OR REPLACE FUNCTION teste() returns void as $$
DECLARE
    inv_row record;
BEGIN
    FOR inv_row in SELECT * FROM sa_inventory s LEFT JOIN dim_inventory d ON s.macaddr = d.macaddr LOOP
        IF inv_row.s.processor <> inv_row.d.processor THEN
            <do something>;
        END IF;
    END LOOP;
END;
$$ language plpgsql;

是否有其他方法可以访问记录数据类型中特定表的列?

1 个答案:

答案 0 :(得分:0)

幸运的是,这里的答案相对简单。您必须使用括号来表示元组:

IF (inv_row.s).processor <> (inv_row.d).processor THEN

这是因为SQL指定了命名空间深度的含义,因此没有这个PostgreSQL就无法安全地确定这意味着什么。因此inv_row.s.processor表示processor架构中s表的inv_row列。但是,(inv_row.s).processor表示获取inf_row表的s列,将其视为元组,然后选择该列的processor列。