Postgresql 检查在不同模式中有多个同名表时是否存在列(PSQL 8.2)

Postgresql 检查在不同模式中有多个同名表时是否存在列(PSQL 8.2),postgresql,Postgresql,为了检查列是否存在,我可以很容易地使用类似的方法: SELECT attname FROM pg_attribute WHERE attrelid = (SELECT oid FROM pg_class WHERE relname = 'YOURTABLENAME') AND attname = 'YOURCOLUMNNAME'; 然而,我遇到了一些问题 SELECT oid FROM pg_class WHERE relname = 'YOURTABLENAME' 当有多个同名表分散在

为了检查列是否存在,我可以很容易地使用类似的方法:

SELECT attname FROM pg_attribute 
WHERE attrelid = (SELECT oid FROM pg_class WHERE relname = 'YOURTABLENAME') 
AND attname = 'YOURCOLUMNNAME';
然而,我遇到了一些问题

SELECT oid FROM pg_class WHERE relname = 'YOURTABLENAME'
当有多个同名表分散在不同的模式中时,它返回所有同名表的OID。如何检查特定架构中的表是否包含我要查找的列?我正在使用Postgres 8.2。

8.2支持。沿着这条思路应该会奏效。当然,您必须提供自己的数据库、模式、表和列名

select * 
from information_schema.columns
where table_catalog = 'sandbox'
and table_schema = 'public'
and table_name = 'calendar'
and column_name = 'iso_year';
检查表或列是否存在的通用解决方案是使用如下函数。 这里我还使用一个函数来解析表名

PS:检查表的简单方法是在您的函数中使用::regclass,请参阅可选的table_exists_v2函数

创建函数tname\u split -验证表名、排序、必要时使用默认值并返回 -带索引的数组:1=全名,2=架构名,3=表名。 p_tabname varchar,-表名或全名schema.table p_schema varchar默认“public”-默认模式名称 将varchar[]返回为$func$ 声明 p整数; 开始 如果p_模式为空,则p_模式:='public';如果结束; p:=strposp_tabname,'.'.-检查模式 如果p=0且p_schema=0,则 引发异常“错误,架构名称默认值不能为空”; 如果p=0,则 返回数组[p|schema |'。|p|tabname,p|schema,p|tabname]; 如果p=1,则 引发异常“错误,表名由点启动”; 其他的 返回数组[p|tabname]| | string_to_arrayp_tabname'。::varchar[]; 如果结束; 终止 $func$语言plpgsql; 创建函数列_存在 - -检查表中是否存在列。如果是,则返回true。 - p_colname varchar, p_tname varchar,-表名或全名schema.table p_schema varchar DEFAULT NULL-默认模式名称 以$func形式返回布尔值$ 声明 t varchar[]; 开始 t=lib.tadm\u tname\u splitp\u tname,p\u schema; 从信息_schema.COLUMNS执行1 其中column_name=1,table_schema=t[2],table_name=t[3]; 发现退货; 终止 $func$语言plpgsql; 创建函数表_存在 - -检查表是否存在,如果存在则返回true,如果不存在则返回false。 - p_tname varchar,-表名或全名schema.table p_schema varchar默认为“public”,-默认模式名称 以$func形式返回布尔值$ 声明 t varchar[]; 开始 t=lib.tadm\u tname\u splitp\u tname,p\u schema; RETURN EXISTS从pg_表中选择tablename,其中schemaname=t[2]和tablename=t[3]; 终止 $func$语言plpgsql; CREATE FUNCTION table_exists_v2p_tname varchar返回布尔值$f$ 声明 tmp regclass; 开始 tmp:=p_tname::regclass;-什么都不做,只解析regclass 返回true; SQL状态为“3F000”时出现异常,然后 返回false; 终止 $f$语言plpgsql;