Postgres 列名或表名啥时候需要引号,啥时候不需要引号?

Posted

技术标签:

【中文标题】Postgres 列名或表名啥时候需要引号,啥时候不需要引号?【英文标题】:When do Postgres column or table names need quotes and when don't they?Postgres 列名或表名什么时候需要引号,什么时候不需要引号? 【发布时间】:2019-08-13 08:00:24 【问题描述】:

让我们考虑以下 postgres 查询:

SELECT * 
FROM "MY_TABLE"
WHERE "bool_var"=FALSE 
 AND "str_var"='something';

当我删除 "str_var" 周围的引号时查询无法正确响应,但当我在 "bool_var" 周围执行相同操作时却没有。为什么?在这种情况下编写查询的正确方法是什么,布尔列周围没有引号,文本列周围没有引号?还有什么?

【问题讨论】:

I can run your entire query with no double quotes anywhere。如果表名或列​​恰好与 Postgres 保留关键字一致,您通常只需要这些双引号。 那些不是“变量”,而是列名。 看解释in the manual @TimBiegeleisen 它仅适用于您的示例,因为您创建的表没有双引号。由于 OP 的查询使用双引号,因此他的表名是大写的,因此如果不使用双引号,他的查询将失败。 @404 好直觉 +1。是的,区分大小写是使用双引号的另一个原因,没想到这一点。 【参考方案1】:

如果你不通过在create table "My_Table_ABC" ( "My_Very_Upper_and_Lowercasy_Column" numeric,...) 中双引号来阻止它,PostgreSQL 会将所有名称(表名、列名等)转换为小写。如果您有这样的名称,则必须始终在选择和其他引用中对这些名称进行双引号。

我建议不要创建这样的表,也不要在a-z0-9_ 之外使用字符。您不能保证曾经针对您的数据库使用的每个软件、库等都支持区分大小写。记住和执行这种双引号也很乏味。

【讨论】:

【参考方案2】:

感谢@TimBiegeleisen 的评论,我能够查明问题所在;我使用保留关键字(“用户”)作为列名。

文档中保留关键字的链接:https://www.postgresql.org/docs/current/sql-keywords-appendix.html

现在我知道不要使用引号来查询列名,而是避免使用保留关键字作为列名。

【讨论】:

一般建议确实是永远不要在 SQL 中的标识符周围使用双引号 在创建表时还有一个约定,可能会导致它区分大小写,因此也需要引号。仅供参考,因此您也可以避免无意中遇到这种情况。 ***.com/questions/20878932/…

以上是关于Postgres 列名或表名啥时候需要引号,啥时候不需要引号?的主要内容,如果未能解决你的问题,请参考以下文章

在excel函数公式中,啥时候要用双引号、单引号,啥时候要用连接符&?

我们啥时候可以在 PostgreSQL 中使用标识符号而不是其名称?

防止 Sequelize 将列名用引号括起来

insert插入数据

SQL Server如何查找表名或列名中包含空格的表和列

sql语句啥时候加引号