Предположим, у нас есть таблица, которая содержит данные, как показано ниже:
CREATE TABLE tab(i INT PRIMARY KEY);
INSERT INTO tab(i) VALUES(1),(2),(3);
SELECT * FROM tab;
Теперь моя цель - создать скрипт SQL, который добавит новый столбец в существующую таблицу:
ALTER TABLE IF EXISTS tab ADD COLUMN col VARCHAR(10);
Все работает как задумано. За исключением того факта, что я хотел бы иметь возможность запускать сценарий несколько раз, но эффект должен иметь место только один раз ( idempotence ).
Если я попытаюсь запустить его снова, я получу:
SQL ошибка компиляции: столбец COL уже существует
Обычно я бы использовал один из следующих подходов:
a) Использование управляющей структуры IF для проверки таблиц метаданных перед выполнением запроса:
-- (T-SQL)
IF NOT EXISTS(SELECT * FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME='TAB' AND COLUMN_NAME = 'COL')
BEGIN
ALTER TABLE tab ADD col VARCHAR(10);
END;
db <> fiddle demo
Я не нашел утверждения IF в документации Snowflake.
b) SQL диалект, поддерживающий синтаксис IF NOT EXISTS
:
-- PostgreSQL
ALTER TABLE IF EXISTS tab ADD COLUMN IF NOT EXISTS col VARCHAR(10);
db <> fiddle demo
Большинство команд Snowflake SQL содержат предложения IF EXISTS
/ OR REPLACE
, что означает, что они написаны таким образом, чтобы запускать сценарии несколько раз.
Я рассматривал возможность использования кода, подобного:
CREATE OR REPLACE TABLE tab
AS
SELECT i, CAST(NULL AS VARCHAR(10)) AS col
FROM tab;
Этот подход, с другой стороны, вызывает ненужное создание таблиц и не сохраняет метаданные (например, первичный ключ).
Есть ли способ добиться аналогичного эффекта на Snowflake? Желательно использовать условный код (например, добавить столбец).