对于下面的代码,我已经从db中删除了hist.game_hist表。现在,根据下面的代码,我希望我的代码拾取else条件并避免进入then条件(因为game_hist不存在,它将抛出错误)。
但到目前为止,当我尝试运行这段代码时,我得到的错误是,从那时起条件“hist.game_hist不存在”。
SELECT
pi.*
FROM stg.stg_game pi
WHERE pi.status != '9'
AND pi.hvr_capture_timestamp::timestamp >
(CASE
WHEN EXISTS (
SELECT 1
FROM information_schema.tables
WHERE table_schema = 'hist' AND table_name = 'game_hist'
)
THEN COALESCE(
(SELECT max(dbt_updated_at) - INTERVAL '120 minutes' FROM hist.game_hist),
'1900-01-01'::timestamp
)
ELSE '1900-01-01'::timestamp
end)
字符串
对于上面的代码,我已经从db中删除了hist.game_hist表。现在,根据下面的代码,我希望我的代码拾取else条件并避免进入then条件(因为game_hist不存在,它将抛出错误)。
但到目前为止,当我尝试运行这段代码时,我得到的错误是,从那时起条件“hist.game_hist不存在”。
2条答案
按热度按时间w6mmgewl1#
您面临的问题来自数据库试图在THEN条件下评估子查询,即使表不存在。您可以使用动态SQL来防止这种情况,只有当表存在时才有条件地运行子查询。尝试此更新的代码。此代码只有当表存在时才有条件地使用PL/pgSQL块和动态SQL执行子查询。它立即设置max_dbt_updated_如果未找到表,则将at设置为默认值,以防止出现您遇到的问题。
字符串
希望对你有帮助:)
svmlkihl2#
下面的查询将生成OP所描述的所需结果:
字符串
这种方法利用了
QUERY_TO_XML
执行动态SQL的能力。因为它是一个SQL查询而不是PL/pgSQL匿名块,所以它可以直接作为更大的SQL查询的一部分使用。如果hist.game_hist
不存在,那么infromation_schema.tables
子查询中的SELECT列表不会被计算,子查询返回NULL
。此查询还避免了重复捕获时间戳比较的默认值。