我有一个小傻问题。我已经安装了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使用配额创建查询 - 因为名称是大写的。所以查询必须用配额写。
答案 0 :(得分:12)
使用双引号创建表时,列和表名称区分大小写。因此,"car_id"
与"CAR_ID"
您需要在不使用双引号的情况下创建表格,然后名称不区分大小写:car_id
与CAR_ID
相同(请注意缺少的引号!)
有关详细信息,请参阅手册:
http://www.postgresql.org/docs/current/static/sql-syntax-lexical.html#SQL-SYNTAX-IDENTIFIERS
编辑:
Oracle 的行为方式与完全相同。唯一的区别是Oracle以大写形式存储名称,而Postgres以小写形式存储它们。但使用引号时的行为是相同的。
答案 1 :(得分:1)
引用标识符也会使其区分大小写,而不带引号的名称始终折叠为小写。例如,PostgreSQL认为标识符FOO,foo和“foo”是相同的,但是“Foo”和“FOO”与这三个和彼此不同。 (在PostgreSQL中将不带引号的名称折叠为小写与SQL标准不兼容,后者表示不带引号的名称应折叠成大写。因此,根据标准,foo应相当于“FOO”而不是“foo”。如果如果您想编写便携式应用程序,建议您始终引用特定名称或从不引用它。)
答案 2 :(得分:0)
在我看来,表vc没有名为car_id
的列。你确定它在那里吗?请\d vel_car
查看表格的结构。
引号是可选的,您通常可以跳过它们。