PostgreSQL - 没有引号的查询语法

时间:2011-06-10 09:10:47

标签: oracle postgresql syntax

我有一个小傻问题。我已经安装了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

你知道为什么吗?

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

3 个答案:

答案 0 :(得分: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 :(得分:1)

来自Postgres documentation

  

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

答案 2 :(得分:0)

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

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