0

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

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

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

但是,当我在 Postgresql 中尝试这个时,我得到了错误

关系 X 不存在

这有效:

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

但这不是

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

相关:在 Postgres 中转义类似关键字的列名

有什么建议么?

4

1 回答 1

1

如手册中所述,未加引号的标识符折叠为小写。

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

所以名称Academic_Attainmentacademic_attainment. 如果您真的坚持使用那些可怕的双引号,那么您需要使用小写标识符:

SELECT * 
FROM "schema_a"."academic_attainment"

一般来说,强烈建议 不要使用带引号的标识符。作为一个经验法则:永远不要使用双引号,你很好。


如果您正在构建动态 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。所以我建议在任何表引用中停止使用数据库名称。

于 2021-02-27T22:42:46.363 回答