将查询从Firebird转换为PostgreSQL

时间:2016-08-22 11:58:26

标签: sql postgresql firebird code-translation

我有一个Firebird查询,我应该重写为PostgreSQL代码。

SELECT TRIM(RL.RDB$RELATION_NAME), TRIM(FR.RDB$FIELD_NAME), FS.RDB$FIELD_TYPE
FROM RDB$RELATIONS RL 
    LEFT OUTER JOIN RDB$RELATION_FIELDS FR ON FR.RDB$RELATION_NAME = RL.RDB$RELATION_NAME 
    LEFT OUTER JOIN RDB$FIELDS FS ON FS.RDB$FIELD_NAME = FR.RDB$FIELD_SOURCE 
WHERE (RL.RDB$VIEW_BLR IS NULL) 
ORDER BY RL.RDB$RELATION_NAME, FR.RDB$FIELD_NAME

我理解SQL,但不知道,如何使用像RDB$RELATIONS这样的系统表等。如果有人帮我这个,那真的很棒,但即使是这些表解释的一些链接也没关系

这条查询是用C ++代码编写的,当我试图这样做时:

pqxx::connection conn(serverAddress.str());
pqxx::work trans(conn);
pqxx::result res(trans.exec(/*there is this SQL query*/));//and there is a mistake

它写道:

  

RDB $ RELATIONS不存在。

2 个答案:

答案 0 :(得分:3)

我认为您正在寻找information_schema

这些表格列于此处:https://www.postgresql.org/docs/current/static/information-schema.html

例如,你可以使用:

select * from information_schema.tables;
select * from information_schema.columns;

答案 1 :(得分:3)

Postgres有另一种存储系统内容信息的方法。这称为System Catalogs

在Firebird中,您的查询基本上为每个模式中的表的每一列返回一行,并附加一个映射到字段数据类型的Integer列。

在使用pg_catalog模式中的系统表的Postgres中,可以使用此查询实现类似的功能:

SELECT 
  TRIM(c.relname) AS table_name, TRIM(a.attname) AS column_name, a.atttypid AS field_type
FROM pg_class c
LEFT JOIN pg_attribute a ON 
  c.oid = a.attrelid
  AND a.attnum > 0 -- only ordinary columns, without system ones
WHERE c.relkind = 'r' -- only tables
ORDER BY 1,2

以上查询也会返回系统目录。如果您要排除,则需要将另一个JOIN添加到pg_namespace,将where子句添加到pg_namespace.nspname <> 'pg_catalog',因为这是存储系统目录的架构。< / p>

如果您还想查看数据类型名称而不是其代表性数字,请添加一个JOIN到pg_type

信息架构由视图集合组成。在大多数情况下,您不需要站在视图后面的整个SQL查询,因此使用系统表将为您提供更好的性能。您可以检查视图定义,只是为了让您开始使用用于形成输出的表和条件。