为什么我在PostgreSQL查询中出现语法错误?

问题描述:

我很抱歉我对PostgreSQL很陌生。当我尝试运行适用于其他人的迁移时,我的电脑上出现错误。我把那个迁移失败的脚本拿到pgAdmin3中运行,看看发生了什么。为什么我在PostgreSQL查询中出现语法错误?

这里是我的查询:

DROP VIEW IF EXISTS vw_admin_question_export_text; 

CREATE VIEW vw_admin_question_export_text AS 
select name || '|' || q.question_key || '|' || qt.type_name || '|' || qo.options import from question q 
full JOIN (SELECT question_id, COALESCE(string_agg(option_text || '|' || option_value, '|'),'') as options 
FROM question_option 
GROUP BY question_id) qo 
on (q.question_id = qo.question_id) 
JOIN question_type qt 
on (q.questiontype_id = qt.questiontype_id); 

这是我得到的错误:

ERROR: syntax error at or near "import" 
LINE 4: ...n_key || '|' || qt.type_name || '|' || qo.options import fro... 
                  ^

********** Error ********** 

ERROR: syntax error at or near "import" 
SQL state: 42601 
Character: 179 

我的同事认为这可能与我的PostgreSQL版本的问题,这是9.5.2

+4

什么是在那里进口?这个查询是否真的成功运行? –

这里的问题是,import is a reserved keyword in PostgreSQL,所以你不能使用它作为别名,不用双引号或使用AS关键字。

简单的测试:

postgres=# SELECT 'foo' import; 
ERROR: 42601: syntax error at or near "import" 
LINE 1: SELECT 'foo' import; 
        ^
LOCATION: scanner_yyerror, scan.l:1082 

postgres=# SELECT 'foo' AS import; 
import 
-------- 
foo 
(1 row) 

postgres=# SELECT 'foo' "import"; 
import 
-------- 
foo 
(1 row) 

为了解决你的问题,你可以简单的添加AS关键字来定义别名:

CREATE VIEW vw_admin_question_export_text AS 
select 
    name || '|' || q.question_key || '|' || qt.type_name || '|' || qo.options AS import 
from question q 
full JOIN (
    SELECT 
     question_id, 
     COALESCE(string_agg(option_text || '|' || option_value, '|'),'') as options 
    FROM question_option 
    GROUP BY question_id 
) qo 
    on (q.question_id = qo.question_id) 
JOIN question_type qt 
    on (q.questiontype_id = qt.questiontype_id); 

另一种选择是简单的选择了其它名称,这并不冲突其中一个保留在关键字列表中(我建议使用该选项)。在任何情况下,总是使用AS是一个好主意,使事情更加明确,避免像这样的问题。