PostgreSQL列名区分大小写吗?

251

我有一个Postgres数据库表格,名字叫做persons,由另一个团队创建,其中有一个列的名称是"first_Name"。现在我想使用PG commander在这个列上查询这个表格。

select * from persons where first_Name="xyz";

它只是返回

错误:列“first_Name”不存在

不确定我是否做错了什么或者我错过了解决这个问题的方法?

5个回答

470
在PostgreSQL中,未用双引号括起来的标识符(包括列名)会被转换为小写。而使用双引号创建的列名会保留大写字母(和/或其他语法错误),因此在其余的生命周期中必须使用双引号括起来。
"first_Name"  "first_Name"  -- upper-case "N" preserved
"1st_Name"    "1st_Name"    -- leading digit preserved
"AND"         "AND"         -- reserved word preserved

但是:
first_Name   → first_name    -- upper-case "N" folded to lower-case "n"
1st_Name     → Syntax error! -- leading digit
AND          → Syntax error! -- reserved word

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

'xyz'

所以,是的,PostgreSQL列名是区分大小写的(当使用双引号时):
SELECT * FROM persons WHERE "first_Name" = 'xyz';

标识符手册。

我的一贯建议是只使用合法的小写名称,因此永远不需要使用双引号。


5
SQL标准定义了大小写不敏感的标识符,就像Postgres实现的那样。唯一的差异是:标准中未引用的标识符会被折叠成大写字母,但pg会将所有未被双引号括起来的内容转换成小写字母。(仅在极少数情况下才相关)详见手册。 - Erwin Brandstetter
27
在SQL中,foobarFOOBARFooBar是相同的标识符。然而,"foobar""FooBar""FOOBAR"是不同的标识符。 - user330315
8
@a_horse_with_no_name 是的,但在 SQL 中 foobarFOOBAR"FOOBAR" 相同,在 PostgreSQL 中 FOOBARfoobar 等与 "foobar" 相同。 - Jasen
2
@KamelMili:我建议您将问题作为问题提出,并提供所有必要的信息。评论不是合适的地方。您可以随时链接到此答案以获取上下文。您还可以在此处留下相关问题的链接评论(以引起我的注意)。 - Erwin Brandstetter
1
请看这里,谢谢。https://dev59.com/XJXfa4cB1Zd3GeqPemx9?noredirect=1#comment60069706_36218161 - Kamel Mili
显示剩余8条评论

27

引用文档的原话:

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

UPDATE MY_TABLE SET A = 5;

可以等价地写成:

uPDaTE my_TabLE SeT a = 5;
你还可以使用引用标识符来编写它:
UPDATE "my_table" SET "a" = 5;

引用标识符会使其区分大小写,而未引用的名称总是折叠为小写(与SQL标准不同,SQL标准中未引用的名称折叠为大写)。例如,在PostgreSQL中,标识符FOOfoo"foo"被视为相同,但"Foo""FOO"与这三个标识符以及彼此都不同。

如果您想编写可移植应用程序,则建议始终引用特定名称或永远不引用它。


所以基本上文件鼓励海绵宝宝案例。 - undefined

15

在PostgreSQL中,混合大小写或大写的列名必须用双引号括起来。因此,最好的惯例是使用所有小写加下划线。


3
根据@erwin-brandstetter的解释,这是不正确的。 - Michael Silver
13
如果你的列名是混合大小写或全大写,为了引用它们,你需要将标识符放在双引号中。这样做是正确的,不这样做就是错误的。 - theferrit32

4

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

1

您可以尝试使用大写字母来命名表和列的示例。(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))";

愚蠢的pgsql SQL解析器在SQL查询中不会将标识符解释为大小写不敏感,但大多数RDMS数据库会这样做。我发现在pgAdmin SQL工具中会更好。 - Tomex Ou

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接