PostgreSQL中单引号和双引号有什么区别?

103

我是PostgreSQL的新手。我尝试过

select * from employee where employee_name="elina";

但结果如下所示出现错误:

ERROR: column "elina" does not exist.

然后我尝试着用单引号替换双引号,步骤如下:

select * from employee where employee_name='elina';

它的结果很好。那么在PostgreSQL中单引号和双引号有什么区别?如果我们不能在PostgreSQL查询中使用双引号,那么在PostgreSQL中是否还有其他用途可以使用双引号?


2
单引号是字符串常量的适当分隔符。就这样。 - Gordon Linoff
1
如有疑问,请阅读手册:https://www.postgresql.org/docs/current/static/sql-syntax-lexical.html#SQL-SYNTAX-IDENTIFIERS - user330315
3个回答

130

双引号用于表或字段的名称。有时可以省略它们。单引号用于字符串常量。这是SQL标准。在详细形式中,您的查询看起来像这样:

select * from "employee" where "employee_name"='elina';

我想知道当你指定为“elina”时,SQL实际上与哪个值进行比较。同时也想知道为什么这不被视为语法错误。这至少会影响到地球上的每一个SQL用户一次。 - jarmod
1
@jarmod 在SQL标准中,"elina"将是该名称列的一个值。 - Michas

51
PostgreSQL手册所述:

在SQL中,字符串常量是由单引号 (') 包围的任意字符序列,例如'This is a string'。要在字符串常量内包含单引号字符,请将两个相邻的单引号编写在一起,例如'Dianne''s horse'。请注意,这与双引号字符 (") 不同。

同一页的其他位置

有第二种标识符:被称为 定界标识符带引号的标识符。它是通过将任意字符序列括在双引号 (") 中形成的。定界标识符始终是标识符,而不是关键字。因此,"select" 可用于引用名为 "select" 的列或表,而未引用的 select 将被视为关键字,因此在需要表或列名的位置使用时会导致解析错误。

简而言之: 单引号用于字符串常量,双引号用于表/列名称。

另一个引号标识符的用法是用于角色名称:如果你想让用户在用户名中有一个 .,双引号可以使其成为合法语法。 - Scott Stafford

2

单引号用于字符串字面量,双引号用于转义数据库对象,例如表名/列名等。

具体而言,如果列/表名与任何保留字/关键字相似,则使用双引号转义。尽管每个RDBMS都有自己的转义方式(例如在MySQL中使用反引号或在SQL Server中使用方括号),但使用双引号是ANSI标准。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接