2017-08-25 78 views
0

我有一段代碼正在運行,它會調用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 

當然這個代碼將無法正常工作,因爲它不會除了使用X.import的THEN子句中,如果進口是沒有模式X.

的一部分

有沒有辦法解決這個問題,或者我是否缺少一些其他簡單的解決方案?

+0

'聲明@count爲int。如果@count> 0,則[ddl語句] Else Return'。或者類似的東西應該工作。使用動態SQL來解決可能的語法問題? –

回答

0

這些模式具有相同的佈局,除了1個表格, 可選地出現在模式中。

表的存在會破壞什麼?爲什麼不在缺失的地方添加它,並在這些環境中將其保留爲空。

我猜測,這個問題的答案分爲兩大類別之一:

  1. 「我沒有訪問/權限。」或者「我不確定是什麼影響。」

在這種情況下,與您的團隊交談,並找出誰可以提供幫助。保持架構標準化應該是最重要的

  1. 「其他事情檢查表是否存在,添加它會破壞事情。」

預測環境之間DDL差異的邏輯是處理特徵切換的不好方法。也許應該將項目添加到積壓件中以更改項目,以便可以標準化模式。

相關問題