为了检查列是否存在,我可以轻松地使用类似的内容:
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。
答案 0 :(得分:4)
8.2支持information_schema views。这些方面的东西应该有效。当然,您必须提供自己的数据库,模式,表和列名称。
select *
from information_schema.columns
where table_catalog = 'sandbox'
and table_schema = 'public'
and table_name = 'calendar'
and column_name = 'iso_year';
答案 1 :(得分:2)
通用解决方案正在使用函数(参见下文)。 这里我还使用了一个函数来解析表名。
PS:检查表的简单方法是在函数::regclass
中使用,请参阅可选的table_exists_v2()函数。
CREATE FUNCTION tname_split(
-- Verify the table name, sort, use defaults if necessary, and returns
-- array with indexes: 1=complete name, 2=schema name, 3=table name.
p_tabname varchar, -- table name or full name (schema.table)
p_schema varchar DEFAULT 'public' -- default schema name
) RETURNS varchar[] AS $func$
DECLARE
p integer;
BEGIN
IF (p_schema IS NULL) THEN p_schema:='public'; END IF;
p := strpos(p_tabname,'.'); -- check schema
IF p=0 AND p_schema='' THEN
RAISE EXCEPTION 'ERROR, schema name default can not be empty';
ELSEIF p=0 THEN
RETURN ARRAY[p_schema||'.'||p_tabname,p_schema,p_tabname];
ELSEIF p=1 THEN
RAISE EXCEPTION 'ERROR, table name initiating by dot';
ELSE
RETURN ARRAY[p_tabname] || string_to_array(p_tabname, '.')::varchar[];
END IF;
END;
$func$ LANGUAGE plpgsql;
CREATE FUNCTION column_exists(
--
-- Check if a column exists in a table. Returns true if yes.
--
p_colname varchar,
p_tname varchar, -- table name or full name (schema.table)
p_schema varchar DEFAULT NULL -- default schema name
) RETURNS BOOLEAN AS $func$
DECLARE
t varchar[];
BEGIN
t = lib.tadm_tname_split(p_tname,p_schema);
PERFORM 1 FROM information_schema.COLUMNS
WHERE column_name=$1 AND table_schema=t[2] AND table_name=t[3];
RETURN FOUND;
END;
$func$ LANGUAGE plpgsql;
CREATE FUNCTION table_exists(
--
-- Check if a table exists, returns true if yes, false if not.
--
p_tname varchar, -- table name or full name (schema.table)
p_schema varchar DEFAULT 'public', -- default schema name
) RETURNS BOOLEAN AS $func$
DECLARE
t varchar[];
BEGIN
t = lib.tadm_tname_split(p_tname,p_schema);
RETURN EXISTS (SELECT tablename FROM pg_tables WHERE schemaname=t[2] AND tablename=t[3]);
END;
$func$ LANGUAGE plpgsql;
CREATE FUNCTION table_exists_v2(p_tname varchar) RETURNS boolean AS $f$
DECLARE
tmp regclass;
BEGIN
tmp := p_tname::regclass; -- do nothing, only parsing regclass
RETURN true;
EXCEPTION WHEN SQLSTATE '3F000' THEN
RETURN false;
END;
$f$ LANGUAGE plpgsql;