CREATE TABLE AS é considerado uma instrução separada de um CREATE TABLE normal e até a versão 9.5 do Postgres (veja a entrada do changelog) não suportava um
IF NOT EXISTS
cláusula. (Certifique-se de consultar a versão correta do manual para a versão que você está usando.) Embora não seja tão flexível, o
CREATE TABLE ... LIKE
a sintaxe pode ser uma alternativa em algumas situações; em vez de pegar sua estrutura (e conteúdo) de um SELECT
instrução, ele copia a estrutura de outra tabela ou visão. Consequentemente, você poderia escrever algo assim (não testado); a inserção final é uma maneira bastante confusa de não fazer nada se a tabela já estiver preenchida:
CREATE OR REPLACE VIEW source_data AS SELECT * FROM foo NATURAL JOIN bar;
CREATE TABLE IF NOT EXISTS snapshot LIKE source_data;
INSERT INTO snapshot
SELECT * FROM source_data
WHERE NOT EXISTS ( SELECT * FROM snapshot );
Como alternativa, se você quiser descartar dados anteriores (por exemplo, uma tabela temporária abandonada), poderá descartar condicionalmente a tabela antiga e criar a nova incondicionalmente:
DROP TABLE IF EXISTS temp_stuff;
CREATE TEMPORARY TABLE temp_stuff AS SELECT * FROM foo NATURAL JOIN bar;