如何在"创建视图"中对表执行计数不知道表是否存在

时间:2017-08-25 14:12:14

标签: sql postgresql not-exists

我有一段代码正在运行,它调用postgresql并且正在一大堆模式中使用(在循环中)。除了1个表之外,这些模式具有相同的布局,该表可选地存在于模式中。

在代码的一部分中,对此特定表的行进行简单计数。但是,由于此表可选地存在于模式中,因此可能不存在。在这种情况下,计数应返回0.

当然,我可以分两步完成:

(简化代码:)

1首先检查表格是否存在

SELECT * 
FROM information_schema.tables
WHERE table_schema = 'X' 
    AND table_name = 'import'
LIMIT 1;

2如果表存在,则对表的计数进行二次调用。

Select count(*) as freq from X.import

如果表格不存在,只需返回0,不进行二次调用。

但是在这种情况下,代码用于创建视图。所以电话会是这样的:

CREATE OR REPLACE VIEW Y AS
WITH TABLES AS (SELECT table_schema||'.'||table_name FROM information_schema.tables)
SELECT CASE 
WHEN 'X.import' in (SELECT * FROM TABLES) 
THEN (SELECT count(*) FROM X.import) 
ELSE 0 
END

当然,这个代码不起作用,因为除了在THEN子句中使用X.import之外,如果import不是模式X的一部分,它就不会有用。

有没有解决方法,或者我错过了一些其他简单的解决方案?

1 个答案:

答案 0 :(得分:0)

  

这些模式除了1个表之外具有相同的布局   可选地存在于模式中。

桌子的存在会破坏什么吗?为什么不将它添加到缺少的位置并在这些环境中保留为空。

我猜这个问题的答案分为两大类:

  1. “我没有访问/权限。”或者“我不确定会产生什么后果。”
  2. 在这种情况下,请与您的团队交谈并找出谁可以提供帮助。保持模式标准化应该是首要任务

    1. “其他事情检查表格是否存在,添加它会破坏事物。”
    2. 预测环境之间DDL差异的逻辑是处理功能切换的一种不好的方法。也许应该将项目添加到待办事项中以更改内容,以便您可以标准化架构。