我试着从一个数据库客户端重构一个查询,这个客户端是根据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中,而无需编写自定义函数??
1条答案
按热度按时间xjreopfe1#
没有比这更好的办法了。
在
information_schema.routines
中,你可以拥有一个独立于版本的数据库例程视图。在information_schema
中,对于SQL标准知道的其他数据库对象,也有类似的独立于版本的视图。