Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Postgresql中使用表别名访问记录内的列_Postgresql - Fatal编程技术网

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

在Postgresql中使用表别名访问记录内的列,postgresql,Postgresql,我试图使用记录数据类型对查询结果进行迭代。但是,如果尝试使用查询中定义的表别名访问一列,则会出现以下错误: 错误:架构“库存行”不存在 上下文:SQL命令“选择库存行s.processor库存行d.processor” PL/pgSQL函数“teste”在IF的第7行 以下是引发此错误的代码: CREATE OR REPLACE FUNCTION teste() returns void as $$ DECLARE inv_row record; BEGIN FOR inv_ro

我试图使用记录数据类型对查询结果进行迭代。但是,如果尝试使用查询中定义的表别名访问一列,则会出现以下错误:

错误:架构“库存行”不存在 上下文:SQL命令“选择库存行s.processor库存行d.processor” PL/pgSQL函数“teste”在IF的第7行

以下是引发此错误的代码:

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;
CREATE或REPLACE函数teste()返回void作为$$
声明
存货行记录;
开始
对于s.macaddr=d.macaddr循环中从sa_库存的左侧连接dim_库存d中选择*的库存行
如果是第四排存货处理人,则为第四排存货处理人
;
如果结束;
端环;
结束;
$$语言plpgsql;

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

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

IF (inv_row.s).processor <> (inv_row.d).processor THEN
IF(inv_row.s).处理器(inv_row.d).处理器然后
这是因为SQL指定了名称空间深度的含义,因此没有此PostgreSQL无法安全地确定这意味着什么。因此
inv_row.s.processor
inv_row
架构中
s
表的
processor
列。但是
(inv\u row.s).processor
意味着取inf\u row表的
s
列,将其视为一个元组,并取其
processor
列。

删除IF(…)ENDIF,并将
inv\u row.s.processor inv\u row.d.processor
添加到where子句或联接条件?顺便说一句:qou不能在resultrow中采用“三个.级别.名称”。resultrow只有一个级别的名称。在您的查询中命名它们(
选择x.y作为a,p.q作为b…
),您将在那里。