【问题标题】:Translating query from Firebird to PostgreSQL将查询从 Firebird 转换为 PostgreSQL
【发布时间】:2016-12-28 23:20:06
【问题描述】:

我有一个 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 不存在。

【问题讨论】:

  • 老实说,您当前的查询看起来像有效的 SQL,除了表和列名语法。你能发布你的表schema(表名加上列名/类型)吗?
  • @TimBiegeleisen 我对问题文本添加了一些更改。

标签: sql postgresql firebird code-translation


【解决方案1】:

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

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

在 Postgres 中使用 pg_catalog 架构中的系统表可以使用此查询来实现类似的操作:

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 和带有 pg_namespace.nspname <> 'pg_catalog' 的 where 子句,因为这是存储系统目录的架构。

如果您还想查看数据类型名称而不是其代表编号,请将 JOIN 添加到 pg_type


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

【讨论】:

  • 你能帮我另一个query example,也许你可以给我一些链接/书籍/等,特别是像我这样的傻瓜)
  • @koshachok 你已经有了一个信息源——系统目录和信息模式。无论如何,如果您需要进一步的帮助,请在 SO 上发布另一个问题。
  • 好的,但是如何将一些 Firebird 的名称与 Postgres 的名称关联起来?
  • @koshachok 正如我所说 - 如果您还有其他问题要解决,请将其作为一个新问题发布到 SO :) 虽然,没有“all-database-system-column-names-翻译器”,所以你必须知道你的 Firebird 查询在做什么,并在 Postgres 参考手册中查找。
  • 您是否阅读过您最初发布的代码?它也有没有AS 的别名...这个子句是可选的...
【解决方案2】:

我认为您正在寻找information_schema

这里列出了表格:https://www.postgresql.org/docs/current/static/information-schema.html

所以例如你可以使用:

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

【讨论】:

    猜你喜欢
    • 2021-10-30
    • 1970-01-01
    • 2018-12-08
    • 1970-01-01
    • 2014-04-01
    • 2021-02-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多