我有一个查询,如果缺少某些列,我本质上想要一个后备值。我想知道我是否可以仅在查询中处理此问题(而不是先进行探测并发送单独的查询。实质上,我正在寻找与之等效的方法来COALESCE处理缺少列的情况。
COALESCE
想象下面的两个表。
T1 id | title | extra 1 A | value - and - T2 id | title 1 A
我希望能够使用相同的查询从这两个表中进行选择。
例如,如果t2实际上有一个“额外”列,我可以使用
SELECT id,title, COALESCE(extra, 'default') as extra
但这仅在列值为NULL的情况下有效,而在列完全丢失时则无效。
我希望使用SQL版本,但我也可以接受PLPGSQL函数(行为类似于COALLESCE)。
给SQL纯粹主义者的提示:我真的不喜欢辩论为什么要在SQL中而不是在应用程序逻辑中这样做(或者为什么我不只是将列永久添加到架构中),所以请将您的评论/答案限制为具体的请求,而不是您对数据库“正确性”的看法,或者其他可能使您对此问题感到恼怒的看法。
一种方法是查找信息模式表并对其进行一点魔术。
就像是:
SELECT id, title, CASE WHEN extra_exists THEN extra ELSE 'default' END AS extra FROM mytable CROSS JOIN ( SELECT EXISTS (SELECT 1 FROM information_schema.columns WHERE table_name='mytable' AND column_name='extra') AS extra_exists) extra
编辑:需要为要查询的表传递“ mytable”的位置。