PostgreSQL - 没有引号的查询语法

问题描述 投票:7回答:3

我有一个小傻问题。我已经安装了PostgreSQL数据库服务器,但是当我运行查询时,列标识符没有引号存在问题。我不知道为什么需要标识符周围的引号。我的查询:

SELECT vc."CAR_ID"
  FROM "VEL_CAR" vc, "VEL_DRIVER" vd, "VEL_DRIVER_CAR" vdc
WHERE vc."CAR_ID" = vdc."CAR_ID" and
      vdc."DRIVER_ID" = vd."DRIVER_ID";

我在Oracle DB中的做法是不使用“。所以在Oracle中:

SELECT vc.CAR_ID
  FROM VEL_CAR vc, VEL_DRIVER vd, VEL_DRIVER_CAR vdc
WHERE vc.CAR_ID = vdc.CAR_ID and
      vdc.DRIVER_ID = vd.DRIVER_ID;

当我在PostgreSQL中没有引号运行此查询时,它会抛出有关语法的错误:

ERROR:  column vc.car_id does not exist
LINE 1: SELECT vc.CAR_ID

你知道为什么吗?

--SOLVED--谢谢,现在我解决了这个问题!这是关于表创建。我使用pgAdminIII创建了表对象,并且我写了大写的表名和列名。 pgAdminIII使用配额创建查询 - 因为名称是大写的。所以查询必须用配额写。

oracle postgresql syntax
3个回答
12
投票

使用双引号创建表时,列和表名称将区分大小写。所以"car_id"是一个与"CAR_ID"不同的名字

您需要在不使用双引号的情况下创建表,然后名称不区分大小写:car_idCAR_ID相同(请注意缺少的引号!)

有关详细信息,请参阅手册

http://www.postgresql.org/docs/current/static/sql-syntax-lexical.html#SQL-SYNTAX-IDENTIFIERS

编辑: Oracle的行为方式完全相同。唯一的区别是Oracle以大写形式存储名称,而Postgres以小写形式存储它们。但使用引号时的行为是相同的。


1
投票

来自Postgres documentation

引用标识符也会使其区分大小写,而不带引号的名称始终折叠为小写。例如,PostgreSQL认为标识符FOO,foo和“foo”是相同的,但是“Foo”和“FOO”与这三个和彼此不同。 (在PostgreSQL中将不带引号的名称折叠为小写与SQL标准不兼容,后者表示不带引号的名称应折叠成大写。因此,根据标准,foo应相当于“FOO”而不是“foo”。如果如果您想编写便携式应用程序,建议您始终引用特定名称或从不引用它。)


0
投票

在我看来,表vc没有名为car_id的列。你确定它在那里吗?做\d vel_car看表的结构。

引号是可选的,您通常可以跳过它们。

© www.soinside.com 2019 - 2024. All rights reserved.