当当前架构与某个函数不同时,属性表示法函数调用会出错。我创建了一个函数CREATE FUNCTION pub.FullName(pub.reps) RETURNS text AS$func$ select ($1.fname || ' ' || $1.lname)$func$ LANGUAGE SQL;我试图用属性表示法调用函数,如docs):select r.fullname from pub.reps r;但收到一条错误消息:ERROR: column "fullname" does not exist使用函数表示法的查询工作正常:select pub.fullname(r.*) from pub.reps r;数据库已通过备份/还原从PostgreSQL 10迁移。Select version()给出:PostgreSQL 11.3, compiled by Visual C++ build 1914, 64-bit升级版。发现如果我将pubschema设置为默认值,那么select r.fullname from pub.reps r可以正常工作。 最佳答案 你自己找到了问题的根源。准确地说:函数pub的模式必须列在当前search_path中的任何位置,不必是“默认”或“当前”模式(列表中的第一个)。相关:How does the search_path influence identifier resolution and the "current schema"所以Postgres没有找到函数。在这方面,博士后11和博士后10没有区别。不过,也有一些值得注意的相关发展。你提到:数据库已通过备份/还原从PostgreSQL 10迁移。考虑一下release notes for Postgres 11中指出的这一微妙变化:在消除函数与列引用之间的歧义时考虑语法形式(Tom Lane)当x是表名或复合列时,PostgreSQL有传统上认为f(x)和x.f的句法形式是等价的,允许编写函数然后使用好像是按需计算的列。但是,如果两者都是解释是可行的,专栏的解释总是选择,如果用户希望功能解释。如果有歧义选择符合句法形式的解释。因此,如果表fullname中有一列reps,并且还有您显示的函数pub.fullname(pub.reps),那么Postgres10,即使使用函数表示法,仍然会选择该列:SELECT fullname(r) FROM reps r; -- resolves to column if it exists, ignoring function对于Postgres 10,db小提琴herePostgres 11(更合理地)选择函数:对于Postgres 11,db小提琴herePostgres 12(目前是beta版)最终实现了真正生成的列The release notes:添加对生成列的支持(Peter Eisentrut)生成的列的内容是根据表达式计算的(包括对同一表中其他列的引用)而不是由INSERT或UPDATE命令指定。不过,只有STORED生成的列进入了这个版本。(更有趣的IMO)VIRTUAL variant was postponed for a later release。希望13岁。你的桌子可能是这样的:CREATE TABLE pub.reps ( reps_id int GENERATED ALWAYS AS IDENTITY PRIMARY KEY, fname text NOT NULL, lname text NOT NULL, fullname text GENERATED ALWAYS AS (fname || ' ' || lname) STORED);分贝小提琴here我声明了fname和lname列NOT NULL。否则,您的简单连接(fname || ' ' || lname)就是一个陷阱。见:How to concatenate columns in a Postgres SELECT?Combine two columns and add into one new column关于sql - 函数调用的属性符号给出错误,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56816432/
10-15 19:41
查看更多