在PostgreSQL中将关键字作为名称的列

时间:2015-04-15 06:16:39

标签: sql postgresql keyword

我有几个表有关键字作为列名。我无法使用它们编写子查询。即使我使用不存在的列名,查询仍然有效。例如

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)

我有几个问题 - 当我在子查询中使用不存在的列名时,它可以工作。但是如果我在查询中使用相同的列名,我会收到错误。如何在子查询中使用关键字列名称而不会遇到这样的意外情况?我知道使用关键字作为列名并不是一个好主意,但系统已经存在了20年,现在不能更改列名。

2 个答案:

答案 0 :(得分:1)

  

当我在子查询中使用不存在的列名时,它可以工作。

嗯,但不是你认为它有效的方式。

它将解析到查询的其他部分中的列(此处为另一个表)。

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

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

这与“查看”与列名称选择不相关无关,如果您的列名为“x”,则会发生同样的情况。

答案 1 :(得分:0)

另一种方法是使用内连接而不是子查询。列名中的歧义在这里更明显,您可以使用别名来消除歧义,例如:

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