一尘不染

列不存在时Postgres返回默认值

sql

我有一个查询,如果缺少某些列,我本质上想要一个后备值。我想知道我是否可以仅在查询中处理此问题(而不是先进行探测并发送单独的查询。实质上,我正在寻找与之等效的方法来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中而不是在应用程序逻辑中这样做(或者为什么我不只是将列永久添加到架构中),所以请将您的评论/答案限制为具体的请求,而不是您对数据库“正确性”的看法,或者其他可能使您对此问题感到恼怒的看法。


阅读 189

收藏
2021-05-16

共1个答案

一尘不染

一种方法是查找信息模式表并对其进行一点魔术。

就像是:

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”的位置。

2021-05-16