如何在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
专家
已提问 6 个月前69 查看次数
1 回答
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
专家
已回答 6 个月前

您未登录。 登录 发布回答。

一个好的回答可以清楚地解答问题和提供建设性反馈,并能促进提问者的职业发展。

回答问题的准则