私はPostgreSQLを使用しており、SQL初心者です。クエリからテーブルを作成しようとしていますが、実行すると:
CREATE TABLE table_name AS
(....query...)
それはうまく機能します。しかし、「存在しない場合」を追加して実行すると:
CREATE TABLE IF NOT EXISTS table_name AS
(....query...)
まったく同じクエリを使用して、私は得る:
ERROR: syntax error at or near "as"
これを行う方法はありますか?
CREATE TABLE AS は通常のステートメントとは別のステートメントと見なされます CREATE TABLE 、およびPostgresバージョン9.5まで( 変更ログエントリ )はIF NOT EXISTS
句をサポートしていませんでした。 (使用しているバージョンのマニュアルの正しいバージョンを確認してください。)
それほど柔軟ではありませんが、CREATE TABLE ... LIKE
構文は状況によっては代替となる場合があります。構造(およびコンテンツ)をSELECT
ステートメントから取得するのではなく、別のテーブルまたはビューの構造をコピーします。
したがって、このような(テストされていない)ものを書くことができます。最後の挿入は、テーブルにすでにデータが入力されている場合は何もしない、ややこしい方法です。
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 );
または、以前のデータ(たとえば、破棄された一時テーブル)を破棄する場合は、古いテーブルを条件付きで削除し、無条件に新しいテーブルを作成できます。
DROP TABLE IF EXISTS temp_stuff;
CREATE TEMPORARY TABLE temp_stuff AS SELECT * FROM foo NATURAL JOIN bar;
このための関数を作成する場合は、 システムカタログテーブルpg_class
に基づいてください。 情報スキーマ または 統計コレクタ (アクティブ化されている場合のみ存在する)のビュー。
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;
この関数はテーブル名とクエリ文字列を受け取り、オプションでテーブルを作成するスキーマも受け取ります(デフォルトは 現在のスキーマ です)。
関数ヘッダーで=
を、関数本体で:=
を正しく使用していることに注意してください。
また、識別子が識別子としてエスケープされる方法にも注意してください。テーブルが存在しないため、regclass
は使用できません。
簡単です:
CREATE TABLE IF NOT EXISTS abc ( sql_id BIGINT(20) NOT NULL
AUTO_INCREMENT PRIMARY KEY, sender VARCHAR(20) NULL)
これを試して、
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
Doを使用します。
do $$ begin
if not exists ( SELECT 1
FROM information_schema.tables
WHERE table_schema = 'schema_name'
AND table_name = 'bla ') then
create table schema_name.bla as select * from blu;
end if;
end $$;