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