为什么我在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
答
这里的问题是,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
是一个好主意,使事情更加明确,避免像这样的问题。
什么是在那里进口?这个查询是否真的成功运行? –