2016-05-12 116 views
-1

我很抱歉我對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

什麼是在那裏進口?這個查詢是否真的成功運行? –

回答

0

這裏的問題是,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是一個好主意,使事情更加明確,避免像這樣的問題。

相關問題