PostgreSQL列名称区分大小写吗?

时间:2014-01-02 08:21:15

标签: sql postgresql identifier case-sensitive case-insensitive

我在Postgres中有一个数据库表,persons由另一个名称为"first_Name"的列名团队传下来。现在我正在尝试使用PG指令器在此列名称上查询此表。

select * from persons where first_Name="xyz";

它只会返回

  

错误:列“first_Name”不存在

我不确定我是在做一些愚蠢的事情,还是我找不到解决这个问题的方法?

4 个答案:

答案 0 :(得分:212)

所有非双引号的标识符(包括列名)在PostgreSQL中折叠为小写。使用双引号创建并因此保留大写字母(和/或其他语法违规)的列名必须在其余生中进行双引号。所以,,PostgreSQL列名称区分大小写:

SELECT * FROM persons WHERE "first_Name" = 'xyz';

同时修复'xyz'周围不正确的双引号。值(字符串文字)包含在单引号

Read the manual here.

我的常设建议是专门使用合法的小写名称,因此不需要双引号。

答案 1 :(得分:11)

引用documentation

  

关键字和不带引号的标识符不区分大小写。因此:

UPDATE MY_TABLE SET A = 5;
     

可以等同地写成:

uPDaTE my_TabLE SeT a = 5;

引用标识符使其区分大小写,而未引用的名称始终折叠为小写:

UPDATE "my_table" SET "a" = 5;  // equivalent to the above examples

答案 2 :(得分:2)

在postgres sql中必须双引号混合大小写或大写的列名。所以最好的惯例是用下划线跟随所有小案例。

答案 3 :(得分:1)

如果使用 JPA,我建议更改为小写模式、表和列名称,您可以使用下一个说明来帮助您:

select
    psat.schemaname,
    psat.relname,
    pa.attname,
    psat.relid
from
    pg_catalog.pg_stat_all_tables psat,
    pg_catalog.pg_attribute pa
where
    psat.relid = pa.attrelid

更改架构名称:

ALTER SCHEMA "XXXXX" RENAME TO xxxxx;

更改表名:

ALTER TABLE xxxxx."AAAAA" RENAME TO aaaaa;

更改列名:

ALTER TABLE xxxxx.aaaaa RENAME COLUMN "CCCCC" TO ccccc;