我有一个db表,Postgres中由另一个团队传下来的人有一个列名,比如“first_Name”。现在我正在尝试使用PG命令来查询这个列名上的表。

select * from persons where first_Name="xyz";

然后它就返回了

错误:first_Name列不存在

不确定我是否在做一些愚蠢的事情,或者是否有一个解决我错过的问题的方法?


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

"first_Name"

值(字符串字面量/常量)用单引号括起来:

'xyz'

所以,是的,PostgreSQL列名是区分大小写的(当双引号时):

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

在这里阅读关于标识符的手册。

我的一贯建议是只使用合法的小写名字,这样就不需要双引号了。


引用文件:

关键字和不带引号的标识符不区分大小写。因此: 更新my_table set a = 5 可以等价地写成: SeT my_TabLE = 5;

你也可以用带引号的标识符来写:

UPDATE "my_table" SET "a" = 5;

引用标识符使其区分大小写,而不带引号的名称总是折叠成小写(不像SQL标准中不带引号的名称折叠成大写)。例如,标识符FOO, FOO和"FOO"被PostgreSQL认为是相同的,但"FOO"和"FOO"与这三个和彼此不同。

如果你想要编写可移植的应用程序,建议你总是引用一个特定的名字,或者永远不要引用它。


在PostgresQL中,大小写混合的列名必须使用双引号。所以最好的惯例是在所有小写字母后面加下划线。


如果使用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;

您可以尝试用大写字母命名表和列。(postgresql)

//Sql;
      create table "Test"
        (
        "ID" integer,
        "NAME" varchar(255)
        )



//C#
  string sqlCommand = $@"create table ""TestTable"" (
                                ""ID"" integer GENERATED BY DEFAULT AS IDENTITY primary key, 
                                ""ExampleProperty"" boolean,
                                ""ColumnName"" varchar(255))";