PostgreSQL列名称区分大小写吗?


157

persons在另一个列名称为的团队的Postgres中有一个db表说"first_Name"。现在我正试图使用​​PG命令来查询此列名上的该表。

select * from persons where first_Name="xyz";

它只是返回

错误:列“ first_Name”不存在

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

Answers:


284

所有未双引号的标识符(包括列名)在PostgreSQL中被折叠为小写。用双引号创建的列名并因此保留了大写字母(和/或其他语法违规),必须在余下的时间将双引号引起来:("first_Name"

因此,是的,PostgreSQL列名称区分大小写:

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

还要解决不正确的双引号'xyz'(字符串文字)用单引号引起来

在此处阅读手册。

我的长期建议是仅使用合法的小写名称,因此不需要双引号。


4
@ArtB:SQL标准定义了区分大小写的标识符,就像Postgres实现它一样。唯一的偏差:未加引号的标识符在标准中折叠为大写,而pg用小写的形式将所有未用双引号引起来的标识符括起来。(仅在极少数情况下才有用。)此处的手册详细信息。
Erwin Brandstetter,2014年

1
@adfs:我认为我无法比已经解释的更好。有关更多信息,请访问我反复提供的手册的链接。
Erwin Brandstetter 2014年

15
@adfs:在SQL中foobarFOOBARFooBar是相同的标识符。但是"foobar""FooBar""FOOBAR"是不同的标识符
a_horse_with_no_name 2015年

5
@a_horse_with_no_name是,但在SQL下foobarFOOBAR相同"FOOBAR",在potgresql 等下FOOBARfoobar相同"foobar"
杰森

1
@KamelMili:我建议您以提供所有必要信息的方式提问。评论不是地方。您可以始终链接到此答案以获取上下文。您可以在此处通过相关问题的链接发表评论(也可以引起我的注意)。
Erwin Brandstetter,2016年

16

引用文档

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

UPDATE MY_TABLE SET A = 5;

可以等效地写成:

uPDaTE my_TabLE SeT a = 5;

您也可以使用带引号的标识符来编写它:

UPDATE "my_table" SET "a" = 5;

引用标识符使其区分大小写,而未引用的名称总是折叠为小写(与SQL标准不同,未引用的名称折叠为大写)。例如,PostgreSQL认为标识符FOOfoo"foo"是相同的,但"Foo""FOO"这三个标识符互不相同。

如果您要编写可移植的应用程序,建议您始终引用一个特定名称,或者永远不要引用该名称。


8

混合大小写的列名必须在PostgresQL中用双引号引起来。因此,最好的约定是在所有小写字母后加下划线。


2
根据@ erwin-brandstetter提供的解释,这是不正确的
Michael Silver

9
这怎么不正确?如果列名是大小写混合的,为了引用它们,您需要将标识符放在双引号中。
theferrit32
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.