如何在Redshift中实现 IF NOT EXISTS 功能

0

【以下的问题经过翻译处理】 我正在尝试在Redshift上实现从SQL Server的一个功能:如果某一列存在忽略该列,否则将其添加到表中。

我在stackoverflow上看到了这些帖子,但没有找到适当的解决方案:

  1. https://stackoverflow.com/questions/65103448/redshift-alter-table-if-not-exists
  2. https://stackoverflow.com/questions/42035068/redshift-add-column-if-not-exists
  3. https://stackoverflow.com/questions/42669237/workaround-in-redshift-for-add-column-if-not-exists

我能够判断的列是否存在,得到TRUE或FALSE值。 但是我不知道如何更改表以添加或删除一个列。 我是新手,非常感激任何回应!

以下是我尝试的一些内容:

IF (SELECT EXISTS(SELECT * FROM pg_catalog.pg_table_def
    WHERE schemaname = 'my_schema'
     AND tablename = 'my_table'
     AND "column" = 'my_new_column'
)) <> TRUE
THEN
   ALTER TABLE my_table
   ADD COLUMN my_new_column varchar
END IF;

CREATE OR REPLACE PROCEDURE if_else()
LANGUAGE plpgsql
AS $$
BEGIN
IF (SELECT EXISTS(SELECT * FROM pg_catalog.pg_table_def
    WHERE schemaname = 'my_schema'
     AND tablename = 'my_table'
     AND "column" = 'my_new_column'
)) <> TRUE
THEN
   ALTER TABLE my_table
   ADD COLUMN my_new_column varchar
END IF;
END;
$$
;

CALL if_else();

还有一些失败的测试:

CREATE OR REPLACE PROCEDURE alter_my_table()
AS $$
BEGIN
   ALTER TABLE my_table
   ADD COLUMN my_new_column varchar
END;
$$
LANGUAGE plpgsql
;

SELECT 
   CASE WHEN COUNT(*) THEN 'warning: column exists already.'
   ELSE CALL alter_my_table();
   END
FROM pg_catalog.pg_table_def
     WHERE schemaname = 'my_schema'
     AND tablename = 'my_table'
     AND "column" = 'my_new_column'

感谢您的时间。

profile picture
EXPERTE
gefragt vor 6 Monaten69 Aufrufe
1 Antwort
0

【以下的回答经过翻译处理】 下面给出了一个带参数的存储过程列子,如果列不存在,将执行列添加操作。

CREATE OR REPLACE PROCEDURE add_table_column(s_name varchar, t_name varchar, c_name varchar, c_type varchar)
LANGUAGE plpgsql
AS $$
BEGIN
IF (SELECT count(1) FROM pg_catalog.pg_table_def
    WHERE schemaname = s_name
     AND tablename = t_name
     AND "column" = c_name
) = 0
THEN
   execute 'ALTER TABLE '||s_name||'.'||t_name||' ADD COLUMN '||c_name||' '||c_type;
END IF;
END;
$$
;

create table public.tst (col1 numeric);

call add_table_column('public','tst','col2','numeric');

profile picture
EXPERTE
beantwortet vor 6 Monaten

Du bist nicht angemeldet. Anmelden um eine Antwort zu veröffentlichen.

Eine gute Antwort beantwortet die Frage klar, gibt konstruktives Feedback und fördert die berufliche Weiterentwicklung des Fragenstellers.

Richtlinien für die Beantwortung von Fragen