2016-05-12 2 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

Что такое 'import' там? Действительно ли этот запрос действительно успешно выполнялся? –

ответ

0

Проблема заключается в том, что import is a reserved keyword in PostgreSQL, поэтому вы не можете использовать его как псевдоним без двойного цитирования или с помощью ключевого слова AS.

Simpler тест:

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 - это хорошая идея сделать вещи более явными и избежать таких проблем, как этот.

Смежные вопросы