Столбец date_norm не существует в Postgresql

Я собираюсь перенести свои данные из sqlite3 в PostgreSQL (версия 10.1), но некоторые операторы запросов выглядят несовместимыми с оригиналами. например, утверждение:

SELECT date+300 AS date_norm, close FROM History WHERE date_norm>1502681700;

при запуске в sqlite3 я получаю:

ОШИБКА: столбец date_norm не существует

СТРОКА 1: ...T date+300 AS date_norm, закрыть ИЗ истории, ГДЕ date_norm›...

Я понятия не имею об ошибке, и любые подсказки приветствуются. заранее спасибо.


person lzwujun    schedule 13.03.2018    source источник


Ответы (1)


Возникла проблема с существующим запросом, который необходимо изменить.

SELECT "date"+300 AS date_norm, close 
FROM History
WHERE "date" > (1502681700-300);
  • Вы не можете ссылаться на column alias, сформированный в предложении select внутри предложения where. Фактическая последовательность выполнения SQL НЕ совпадает с тем, как вы пишете запрос SQL. На самом деле предложение where выполняется перед предложением select, поэтому псевдоним «date_norm» просто не понимается предложением where. Вместо этого обратитесь к исходному столбцу «дата» и соответствующим образом измените способ фильтрации, здесь я просто вычел 300 из постоянного значения, которое вы использовали.

Кроме того, date является «зарезервированным словом» в стандартном SQL (см. ). Вы не должны использовать зарезервированные слова в качестве имен столбцов ИЛИ вы должны заключать это имя столбца в кавычки как «дата» (например, select "date" from History). Хотя это не создаст проблем в PostgreSQL, это потенциальная проблема переносимости.

person Paul Maxwell    schedule 13.03.2018
comment
Ваш пункт 1 неверен - та самая страница, на которую вы ссылаетесь, говорит, что DATE зарезервировано в стандартном SQL, но не в PostgreSQL. - person Laurenz Albe; 13.03.2018
comment
Упомянутые стандарты SQL могут быть источником, но именно Postgres реализует ограничения. Честно говоря, я чувствую, что вы были слишком суровы, предполагая, что это неправильно. Совершенно неправильная дата не была бы зарезервированным словом, но мы знаем, что это так. - person Paul Maxwell; 13.03.2018
comment
PostgreSQL не никоим образом не ограничивает использование date. Я не хочу показаться грубым или резким, но нет проблем с использованием date без кавычек в качестве имени в PostgreSQL. В лучшем случае вам следует посоветовать избегать стандартных ключевых слов SQL, поскольку они могут создавать проблемы при переносе. - person Laurenz Albe; 13.03.2018
comment
Очень хорошо, я смягчил совет. Спасибо. - person Paul Maxwell; 13.03.2018
comment
Всем спасибо, все ваши советы ценны - person lzwujun; 14.03.2018