Postgresql:文字 table 名称

Postgresql: literal table names

我正在制作一个需要构建 Postgresql 查询的应用程序,这些查询将在 table 名称是保留关键字等情况下成功执行

在 Sql 服务器语法中,这是通过将所有内容括在方括号 [] 中来实现的,即 SELECT * FROM [database].[schema].[table_name].

我认为 Postgresql 中的等价物是使用双引号 ""SELECT * FROM "database"."schema"."table_name".

但是,当我在 Postgresql 中尝试此操作时,出现错误

Relation X doesn't exist

这个有效:

SELECT * FROM "postgres"."schema_a".Academic_Attainment

但这不会:

SELECT * FROM "postgres"."schema_a"."Academic_Attainment"

相关:Escaping keyword-like column names in Postgres

有什么建议吗?

As documented in the manual 未加引号的标识符折叠为小写。

带引号的标识符也区分大小写,因此 "Foo""foo" 的名称不同。

因此名称 Academic_Attainmentacademic_attainment 相同。如果你真的坚持使用那些可怕的双引号,那么你需要使用小写标识符:

SELECT * 
FROM "schema_a"."academic_attainment"

一般来说 strongly recommended 完全使用带引号的标识符。作为一个经验法则:永远不要使用双引号,你没问题。


如果要构造动态 SQL,请使用 format() 函数和 %I 占位符一起执行此操作。它会在必要时(并且只有在那时)处理引用,例如

format('select * from %I.%I', 'public', 'some_table') 产生 select * from public.some_tableformat('select * from %I.%I', 'public', 'group') 产生 select * from public."group"


与您的问题无关:Postgres 不支持跨数据库查询,因此您不应该养成将数据库名称包含在完全限定名称中的习惯。您使用的语法仅适用于您连接到数据库 postgres。所以我建议停止在任何 table 引用中使用数据库名称。