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;