Postgres不会在列名前接受表别名

时间:2012-07-06 21:17:20

标签: sql postgresql jodd

我正在使用一个框架(Jodd),它将表别名添加到SQL Select中的列名。它看起来像格式良好的SQL,但是Postgres对它嗤之以鼻。

update GREETING Greeting 
     set Greeting.ID=5, 
         Greeting.NAME='World', 
         Greeting.PHRASE='Hello World!'  
where (Greeting.ID=5)

给出错误:

Error: ERROR: column "greeting" of relation "greeting" does not exist
SQLState:  42703

有没有办法让Postgres接受SQL?我的另一个选择是破解框架,我不想这样做。

4 个答案:

答案 0 :(得分:35)

问题是您在列中的SET子句中包含表别名。请参阅UPDATE in Postgres docs的文档:

  

column

     

table 中列的名称。如果需要,可以使用子字段名称或数组下标限定列名称。请勿在目标列的规范中包含表格名称 - 例如, UPDATE tab SET tab.col = 1 无效。

这在Postgres中有效:

update GREETING Greeting 
set 
    NAME='World', 
    PHRASE='Hello World!' 
where Greeting.ID=5 ;

答案 1 :(得分:4)

尝试使用最新的Jodd,v3.3.7。这个问题得到解决的地方。

问题出在Jodd库中:实体更新方法正在生成带有表别名的更新语句。新版本根本没有放置表别名;这适用于Postgres和其他数据库。

答案 2 :(得分:3)

检查UPDATE语句上的文档,特别是 部分:在SET子句中使用表别名为列添加前缀是违法的。

UPDATE GREETING Greeting
   SET ID=5, NAME='World', PHRASE='Hello World!'
 WHERE (Greeting.ID=5);

答案 3 :(得分:0)

正如其他人所说,在postgres中使用别名作为要更新的列的名称是非法的,但是请注意,有可能(有时是必要的)在rhs表达式中使用别名。例如:

CREATE TABLE greetings (name VARCHAR(20), phrase VARCHAR(100));
INSERT INTO greetings (name, phrase);
VALUES ('palindrome_1', 'Rise to vote sir'),
       ('palindrome_2', 'Race fast, safe car');

-- You can do something like this:
UPDATE greetings g SET phrase = REVERSE (g.phrase);
                                      -- ^
                                      -- |
                                      -- +--- this works

在此示例中,这有点愚蠢,因为我们不需要该别名。当涉及多个表时,这将变得更加有用。