PostgreSQL 中以关键字作为名称的列

Columns with keywords as names in PostgreSQL

我有几个表将关键字作为列名。我无法使用它们编写子查询。即使我使用不存在的列名,查询也能正常工作。例如

CREATE TABLE tgt("view" int);

CREATE TABLE src(id  int);

select * from tgt where view in (select view from src);
 view 
------
(0 rows)

select * from tgt where view in (select "view" from src);
 view 
------
(0 rows)

select * from tgt where "view" in (select "view" from src);
 view 
------
(0 rows)

select "view" from src;
ERROR:  column "view" does not exist
LINE 1: select "view" from src;

insert into tgt values(1);

insert into src  values(2);

select * from tgt where "view" in (select "view" from src);
 view 
------
    1
(1 row)

select * from tgt where view in (select id  from src);
 view 
------
(0 rows)

我有几个问题 - 当我在子查询中使用不存在的列名时,它起作用了。但是,如果我在查询中使用相同的列名,则会出现错误。如何在没有 运行 的情况下在子查询中使用关键字列名?我知道使用关键字作为列名不是一个好主意,但该系统已经存在了 2 年,现在不能更改列名。

when I use a non-existing column name in a subquery, it works.

嗯,但不是你认为的那样。

它将解析为查询其他部分的列(此处为其他 table)。

select * from tgt where view in (select view from src);

相同
select * from tgt where view in (select tgt.view from src);

这与 "view" 是列名的错误选择无关,如果您的列名为 "x",也会发生同样的事情。

另一种选择是使用内部连接而不是子查询。这里列名的歧义比较明显,可以使用别名来消除歧义,例如:

select DISTINCT t.* 
from tgt t
inner join src s
   on t.view = s.view;