如何在不知道 table 是否存在的情况下对 "Create view" 中的 table 执行计数

How to perform count on table in "Create view" without knowing if table exists

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

在代码的一部分中,对该特定 table 的行进行了简单计数。但是,由于此 table 可选地出现在架构中,因此它可能不存在。在那种情况下,计数应该 return 0.

当然可以分两步搞定:

(简化代码:)

1 首先检查table是否存在

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

2 接下来,如果 table 存在,则对 table 的计数进行二次调用。

Select count(*) as freq from X.import

如果table不存在,直接return0,不二次调用

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

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

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

是否有解决此问题的方法,或者我是否缺少其他一些简单的解决方案?

These schemas have identical layouts apart from 1 table which is optionally present in the schema.

table 的存在会破坏某些东西吗?为什么不在缺少它的地方添加它并在这些环境中将其留空。

我猜这个问题的答案属于两大类之一:

  1. "I don't have access/permission." 或 "I'm not sure what the repercussions are."

在这种情况下,请与您的团队讨论并确定谁可以提供帮助。保持模式标准化应该是重中之重

  1. "Other things check if the table exists, adding it will break things."

根据环境之间的 DDL 差异预测逻辑是处理功能切换的糟糕方法。也许应该将项目添加到待办事项列表中以进行更改,以便您可以标准化架构。