PostgreSQL列名称区分大小写吗?

512*_*009 138 sql postgresql case-sensitive case-insensitive identifier

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

select * from persons where first_Name="xyz";
Run Code Online (Sandbox Code Playgroud)

它只是回归

错误:列"first_Name"不存在

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

Erw*_*ter 245

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

SELECT * FROM persons WHERE "first_Name" = 'xyz';
Run Code Online (Sandbox Code Playgroud)

还要修复不正确的双引号"first_Name".值(字符串文字)用单引号括起来.

请阅读此处的手册.

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

  • 是的,使用双引号是维护地狱的方法. (28认同)
  • @adfs:在SQL中,`foobar`,`FOOBAR`和`FooBar`是相同的标识符.然而,"foobar","FooBar"和"FOOBAR"是不同的标识符 (11认同)
  • @a_horse_with_no_name是的,但在SQL`fobobar`和`FOOBAR`与`"FOOBAR"`相同,在potgresql`FOOBAR`和`foobar`等下与`"foobar"`相同. (4认同)
  • @ArtB:SQL标准定义了不区分大小写的标识符,就像Postgres实现它一样.唯一的偏差:未加引号的标识符在标准中折叠为大写,但pg lower-cases不是双引号的所有内容.(仅适用于罕见的极端情况.)[此处手册中的详细信息.](http://www.postgresql.org/docs/current/interactive/sql-syntax-lexical.html#SQL-SYNTAX-IDENTIFIERS) (3认同)
  • @KamelMili:我建议将您的问题作为*问题*提出,并提供所有必要的信息。评论不是地方。您始终可以链接到此答案以获取上下文。您可以在这里发表评论,并附上您的相关问题的链接(也引起我的注意)。 (2认同)

Eug*_*ash 14

引用文档:

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

UPDATE MY_TABLE SET A = 5;
Run Code Online (Sandbox Code Playgroud)

可以等同地写成:

uPDaTE my_TabLE SeT a = 5;
Run Code Online (Sandbox Code Playgroud)

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

UPDATE "my_table" SET "a" = 5;
Run Code Online (Sandbox Code Playgroud)


ran*_*ess 5

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

  • 这怎么不正确?如果列名是大小写混合的,为了引用它们,您需要将标识符放在双引号中。 (6认同)
  • 根据@ erwin-brandstetter的解释,这是不正确的 (2认同)