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_Attainment
与 academic_attainment
相同。如果你真的坚持使用那些可怕的双引号,那么你需要使用小写标识符:
SELECT *
FROM "schema_a"."academic_attainment"
一般来说 strongly recommended 到 不 完全使用带引号的标识符。作为一个经验法则:永远不要使用双引号,你没问题。
如果要构造动态 SQL,请使用 format()
函数和 %I
占位符一起执行此操作。它会在必要时(并且只有在那时)处理引用,例如
format('select * from %I.%I', 'public', 'some_table')
产生 select * from public.some_table
但 format('select * from %I.%I', 'public', 'group')
产生 select * from public."group"
与您的问题无关:Postgres 不支持跨数据库查询,因此您不应该养成将数据库名称包含在完全限定名称中的习惯。您使用的语法仅适用于您连接到数据库 postgres
。所以我建议停止在任何 table 引用中使用数据库名称。
我正在制作一个需要构建 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_Attainment
与 academic_attainment
相同。如果你真的坚持使用那些可怕的双引号,那么你需要使用小写标识符:
SELECT *
FROM "schema_a"."academic_attainment"
一般来说 strongly recommended 到 不 完全使用带引号的标识符。作为一个经验法则:永远不要使用双引号,你没问题。
如果要构造动态 SQL,请使用 format()
函数和 %I
占位符一起执行此操作。它会在必要时(并且只有在那时)处理引用,例如
format('select * from %I.%I', 'public', 'some_table')
产生 select * from public.some_table
但 format('select * from %I.%I', 'public', 'group')
产生 select * from public."group"
与您的问题无关:Postgres 不支持跨数据库查询,因此您不应该养成将数据库名称包含在完全限定名称中的习惯。您使用的语法仅适用于您连接到数据库 postgres
。所以我建议停止在任何 table 引用中使用数据库名称。