我在Postgres中有一个数据库表,persons
由另一个名称为"first_Name"
的列名团队传下来。现在我正在尝试使用PG指令器在此列名称上查询此表。
select * from persons where first_Name="xyz";
它只会返回
错误:列“first_Name”不存在
我不确定我是在做一些愚蠢的事情,还是我找不到解决这个问题的方法?
答案 0 :(得分:212)
所有非双引号的标识符(包括列名)在PostgreSQL中折叠为小写。使用双引号创建并因此保留大写字母(和/或其他语法违规)的列名必须在其余生中进行双引号。所以,是,PostgreSQL列名称区分大小写:
SELECT * FROM persons WHERE "first_Name" = 'xyz';
同时修复'xyz'
周围不正确的双引号。值(字符串文字)包含在单引号。
我的常设建议是专门使用合法的小写名称,因此不需要双引号。
答案 1 :(得分:11)
关键字和不带引号的标识符不区分大小写。因此:
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;