如果 Redshift 中存在表,则从表中删除行,否则忽略删除
Posted
技术标签:
【中文标题】如果 Redshift 中存在表,则从表中删除行,否则忽略删除【英文标题】:Delete rows from a table if table exists in Redshift otherwise ignore deletion 【发布时间】:2017-08-21 09:24:55 【问题描述】:我正在使用 Redshift。如果表存在,我想要一个查询从红移表中删除选定的行,否则忽略该语句。
【问题讨论】:
您必须提供更多信息。你的问题不是很有帮助 【参考方案1】:Redshift 的 SQL 方言不包含像 IF.. THEN 这样的流控制语句,因此您无法在单个 SQL 语句中执行此操作。
您的应用程序或进程将需要首先查询 Redshift 表元数据以确定表是否存在,例如
select 1 from pg_tables where schemaname = 'myschema' and tablename = 'myschema';
如果返回数据(即表存在),则应用程序或进程将执行删除语句,如果没有返回数据,则应用程序或进程不执行任何操作。基本上,您需要在 Redshift 外部处理“如果这样做,则执行此操作”逻辑。
【讨论】:
【参考方案2】:我推荐@Nathan 的回答。我会使用 python/psycopg2 来设置这个逻辑。第一个查询将检查表在pg_tables
中是否存在(例如SELECT count(1) FROM pg_tables WHERE tablename='foo'
),并将结果存储在一个变量中。然后,您将检查该变量的结果以决定是否启动第二个查询(您的删除)。
但是,也许您不想在 Python 中执行此操作。你只是关于 Redshift (这很甜蜜)。您可以在 Redshift 中运行 DELETE
查询。如果该表不存在,则查询失败并且没有任何反应。如果表是,则删除数据。在这里生成错误并没有什么坏处。
【讨论】:
以上是关于如果 Redshift 中存在表,则从表中删除行,否则忽略删除的主要内容,如果未能解决你的问题,请参考以下文章
Redshift:如果值存在,则从表 1 中获取值,否则从表 2 中提取
mysql - 如果不在另一个表中,则从一个表中选择,否则从另一个表中选择