PostgreSQL: Crear tabla si no existe AS

Estoy usando PostgreSQL y soy un principiante de SQL. Intento crear una tabla a partir de una consulta, y si ejecuto:

CREATE TABLE table_name AS (....query...) 

funciona bien Pero luego si agrego 'if not exists' y corro:

 CREATE TABLE IF NOT EXISTS table_name AS (....query...) 

usando exactamente la misma consulta, obtengo:

 ERROR: syntax error at or near "as" 

¿Hay alguna manera de hacer esto?

CREATE TABLE AS se considera una instrucción separada de una CREATE TABLE normal, y hasta Postgres versión 9.5 (ver input de logging de cambios ) no IF NOT EXISTS cláusula IF NOT EXISTS . (Asegúrese de mirar la versión correcta del manual para la versión que está usando).

Aunque no es tan flexible, la syntax CREATE TABLE ... LIKE puede ser una alternativa en algunas situaciones; en lugar de tomar su estructura (y contenido) de una instrucción SELECT , copy la estructura de otra tabla o vista.

En consecuencia, podrías escribir algo como esto (no probado); la inserción final es una manera bastante desorderada de no hacer nada si la tabla ya está poblada:

 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 ); 

Alternativamente, si desea descartar datos previos (por ejemplo, una tabla temporal abandonada), puede abandonar de manera condicional la tabla anterior e incondicionalmente crear la nueva:

 DROP TABLE IF EXISTS temp_stuff; CREATE TEMPORARY TABLE temp_stuff AS SELECT * FROM foo NATURAL JOIN bar; 

Si va a escribir una function para esto, pg_class tabla de catálogo del sistema pg_class , no en las vistas en el esquema de información o el recostackdor de statistics (que solo existe si está activado).

  • Cómo verificar si una tabla existe en un esquema dado

 CREATE OR REPLACE FUNCTION create_table_qry(_tbl text , _qry text , _schema text = NULL) RETURNS bool AS $func$ DECLARE _sch text := COALESCE(_schema, current_schema()); BEGIN IF EXISTS ( SELECT 1 FROM pg_catalog.pg_class c JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace WHERE n.nspname = _sch AND c.relname = _tbl ) THEN RAISE NOTICE 'Name is not free: %.%',_sch, _tbl; RETURN FALSE; ELSE EXECUTE format('CREATE TABLE %I.%I AS %s', _sch, _tbl, _qry); RAISE NOTICE 'Table created successfully: %.%',_sch, _tbl; RETURN TRUE; END IF; END $func$ LANGUAGE plpgsql; 

La function toma un nombre de tabla y la cadena de consulta, y opcionalmente también un esquema para crear la tabla (por defecto es el esquema actual ).

Tenga en count el uso correcto de = en el encabezado de la function y := en el cuerpo de la function:

  • El operador de asignación olvidado "=" y el lugar común ": ="

También tenga en count cómo se escapan los identificadores como identificadores. No puede usar regclass , ya que la tabla aún no existe:

  • Nombre de tabla como parámetro de function PostgreSQL

Prueba esto,

 create or replace function create_table(tblname text) returns text as $$ BEGIN $1 = trim($1); IF not EXISTS (select relname from pg_stat_user_tables where relname =$1) THEN execute 'create table '||$1||' as select * from tbl'; -- <put your query here> return ''||$1||' Created Successfully !!'; else return ''||$1||' Already Exists !!'; END IF; END $$ language plpgsql 

 create or replace function create_table_qry(tblname text,qry text) returns text as $$ BEGIN $1 = trim($1); IF not EXISTS (select relname from pg_stat_user_tables where relname =$1) THEN execute 'create table '||$1||' as '||$2||''; return ''||$1||' Created Successfully !!'; else return ''||$1||' Already Exists !!'; END IF; END $$ language plpgsql