Para obter um OID de tabela, converta para o tipo de identificador de objeto
regclass
(enquanto conectado ao mesmo banco de dados):SELECT 'mytbl'::regclass::oid;
Isso encontra a primeira tabela (ou visualização, etc.) com o nome fornecido ao longo do
search_path
ou gera uma exceção se não for encontrada. Qualifique o nome da tabela pelo esquema para remover a dependência no caminho de pesquisa:
SELECT 'myschema.mytbl'::regclass::oid;
No Postgres 9.4 ou mais tarde você também pode usar
to_regclass('myschema.mytbl')
, que não gera uma exceção se a tabela não for encontrada:- Como verificar se uma tabela existe em um determinado esquema
Então você só precisa consultar a tabela de catálogo
pg_attribute
para a existência da coluna:SELECT TRUE AS col_exists
FROM pg_attribute
WHERE attrelid = 'myschema.mytbl'::regclass
AND attname = 'mycol'
AND NOT attisdropped -- no dropped (dead) columns
-- AND attnum > 0 -- no system columns (you may or may not want this)