Postgresql 为什么带尾随键入的双引号中的表名是有效语法

Postgresql 为什么带尾随键入的双引号中的表名是有效语法,postgresql,Postgresql,我在我的Postgres终端中输入了以下查询,在后面的双引号之后和分号之前意外出现了l。我期望出现语法错误,但得到的却是查询结果: select * from "myTable"l; 事实上,我可以把我想要的任何东西放在后面的双引号之后,我仍然没有得到语法错误: select * from "myTable"asdkjh; 我检查了我认为应该如何格式化双引号字符串,但它没有提到这一点 那么,为什么这样做呢?将l或asdkjh作为 引入别名的关键字AS是可选的,因此您也可以从foo-AS-x编

我在我的Postgres终端中输入了以下查询,在后面的双引号之后和分号之前意外出现了
l
。我期望出现语法错误,但得到的却是查询结果:

select * from "myTable"l;
事实上,我可以把我想要的任何东西放在后面的双引号之后,我仍然没有得到语法错误:

select * from "myTable"asdkjh;
我检查了我认为应该如何格式化双引号字符串,但它没有提到这一点


那么,为什么这样做呢?

l
asdkjh
作为

引入别名的关键字
AS
是可选的,因此您也可以从foo-AS-x编写

然而,foox中的
确实是一个错误,因为这将被视为一个完整的表名。由于您使用了带引号的标识符,因此很清楚标识符在哪里结束,下一个标识符在哪里开始-因此标识符和别名之间不需要空格

因此,“myTable”asdkjh的
与“myTable”asdkjh的
相同



但是,“myTable”“some_alias”
中的
将是一个错误,因为它被视为一个标识符-要在带引号的标识符中包含一个双引号,您需要写两个引号,因此
“myTable”“some_alias”
引用名为
myTable“some_alias”
的表

引入别名的关键字
AS
是可选的,因此您也可以从foo-AS-x
编写

然而,foox中的
确实是一个错误,因为这将被视为一个完整的表名。由于您使用了带引号的标识符,标识符结束和下一个标识符开始的位置很清楚,因此标识符和别名之间不需要空格

因此,“myTable”asdkjh的
与“myTable”asdkjh的
相同


但是,“myTable”“some_alias”
中的
将是一个错误,因为它被视为一个标识符-要在带引号的标识符中包含一个双引号,您需要写两个引号,因此
“myTable”“some_alias”
引用一个名为
myTable“some_alias”

的表,即尾部垃圾是一个“别名”。您可以这样做:
从asd123的“myTable”中选择asd123.*(此处的空格无关紧要)。别名对于自联接非常重要,例如从表1中选择t1.id,t2.name作为t1.parent\u id=t2.id上的t1内部联接表1 t2。关键字
AS
也是可选的。尾部垃圾是一个“别名”。您可以这样做:
从asd123的“myTable”中选择asd123.*(此处的空格无关紧要)。别名对于自联接非常重要,例如
从表1中选择t1.id、t2.name作为t1.parent\u id=t2.id上的t1内部联接表1 t2。关键字
AS
也是可选的。