postgresql 当列存在时从列中选择一个值(查询在postgres版本之间可移植)

cyvaqqii  于 2023-11-18  发布在  PostgreSQL
关注(0)|答案(1)|浏览(95)

我试着从一个数据库客户端重构一个查询,这个客户端是根据postgres版本动态构建的(pgspecial包的pgresource)。我想知道这是否可能。我知道前面的列名,只是不知道服务器版本。目前这个查询是用python构建的,并且有依赖于数据库版本的分支-有时根据版本有4个不同的查询。示例:

if cur.connection.info.server_version >= 120000:
        relhasoids = "false as relhasoids"
    else:
        relhasoids = "c.relhasoids"

字符串

if cur.connection.info.server_version >= 110000:
    """
    CASE
    WHEN p.prokind = 'a' THEN 'agg'
    WHEN p.prokind = 'w' THEN 'window'
    WHEN p.prorettype = 'pg_catalog.trigger'::pg_catalog.regtype THEN 'trigger'
    ELSE 'normal'
    END as "Type"
    """
else:
    """
    CASE
    WHEN p.proisagg THEN 'agg'
    WHEN p.proiswindow THEN 'window'
    WHEN p.prorettype = 'pg_catalog.trigger'::pg_catalog.regtype THEN 'trigger'
    ELSE 'normal'
    END as "Type" 
    """


我想知道是否有一种方法可以将逻辑转移到SQL中,而无需编写自定义函数??

xjreopfe

xjreopfe1#

没有比这更好的办法了。
information_schema.routines中,你可以拥有一个独立于版本的数据库例程视图。在information_schema中,对于SQL标准知道的其他数据库对象,也有类似的独立于版本的视图。

相关问题