проблема псевдонима столбца postgres - PullRequest
10 голосов
/ 29 октября 2009

Как новичок в Postgresql (я переезжаю, потому что я перевожу свой сайт на heroku, который только его поддерживает, мне нужно реорганизовать некоторые из моих запросов и кода. Вот проблема, которую я не могу понять проблему с:

PGError: ERROR:  column "l_user_id" does not exist
LINE 1: ...t_id where l.user_id = 8 order by l2.geopoint_id, l_user_id ...
                                                             ^

... запрос:

   select distinct 
          l2.*, 
          l.user_id as l_user_id, 
          l.geopoint_id as l_geopoint_id 
     from locations l 
left join locations l2 on l.geopoint_id = l2.geopoint_id 
    where l.user_id = 8 
 order by l2.geopoint_id, l_user_id = l2.user_id desc

Предложение "l.user_id as l_user_id, l.geopoint_id as l_geopoint_id" было добавлено, потому что, очевидно, postgres не любит предложения order с не выбранными полями. Но ошибка, которую я сейчас получаю, делает вид, будто я тоже не получаю псевдонимов. Кто-нибудь с опытом postgres видит проблему?

Скорее всего, у меня будет куча этих проблем - запросы в mySql работают нормально ...

Ответы [ 4 ]

15 голосов
/ 30 октября 2009

В PostgreSQL вы не можете использовать выражение с псевдонимом в порядке. Там работают только простые псевдонимы. Ваш запрос должен выглядеть следующим образом:

   select distinct 
          l2.*, 
          l.user_id as l_user_id, 
          l.geopoint_id as l_geopoint_id 
     from locations l 
left join locations l2 on l.geopoint_id = l2.geopoint_id 
    where l.user_id = 8 
 order by l2.geopoint_id, l.user_id = l2.user_id desc;

Полагаю, вы имеете в виду, что l2.user_id=l.user_id должен идти первым.

Это соответствующее сообщение в общем списке рассылки PostgreSQL. Ниже приведено в документации ORDER BY предложение :

Каждое выражение может быть именем или порядковый номер вывода столбец (ВЫБРАТЬ элемент списка) или его может быть произвольным выражением из входной столбец значения .

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

4 голосов
/ 11 апреля 2012

Я столкнулся с этой же проблемой, используя функции из fuzzystrmatch - в частности, функцию Левенштейна. Мне нужно было как отсортировать по расстоянию строки, так и отфильтровать результаты по расстоянию строки. Я изначально пытался:

SELECT thing.*, 
levenshtein(thing.name, '%s') AS dist 
FROM thing 
WHERE dist < character_length(thing.name)/2 
ORDER BY dist

Но, конечно, я получил ошибку "столбец" dist "не существует" из предложения WHERE ". Я попробовал это, и это сработало:

SELECT thing.*, 
(levenshtein(thing.name, '%s')) AS dist 
FROM thing 
ORDER BY dist

Но мне нужно было указать эту оговорку в предложении WHERE. Кто-то еще в этом вопросе сказал, что предложение WHERE вычисляется до ORDER BY, поэтому столбец не существовал при оценке предложения WHERE. Следуя этому совету, я понял, что вложенный оператор SELECT делает свое дело:

SELECT * FROM 
(SELECT thing.*, 
     (levenshtein(thing.name, '%s')) AS dist 
     FROM thing 
     ORDER BY dist
) items 
WHERE dist < (character_length(items.name)/2)

Обратите внимание, что псевдоним таблицы "items" является обязательным, а псевдоним столбца dist доступен во внешнем SELECT, поскольку он уникален в операторе. Это немного забавно, и я удивлен, что так должно быть в PG, но, похоже, это не сказывается на производительности, поэтому я доволен.

4 голосов
/ 29 октября 2009

У вас есть:

order by l2.geopoint_id, l_user_id = l2.user_id desc

в вашем запросе. Это незаконный синтаксис. Удалите часть = l2.user_id (переместите ее на where, если это одно из условий соединения), и она должна работать.

Обновление Ниже select (с удаленным = l2.user_id) должно работать просто отлично. Я проверил это (с разными именами таблиц / столбцов, очевидно) на Postgres 8.3

select distinct 
       l2.*, 
       l.user_id as l_user_id, 
       l.geopoint_id as l_geopoint_id 
  from locations l 
  left join locations l2 on l.geopoint_id = l2.geopoint_id 
 where l.user_id = 8 
 order by l2.geopoint_id, l_user_id desc
1 голос
/ 29 октября 2009

"было добавлено, потому что, очевидно, postgres не нравятся предложения порядка с не выделенными полями"

"Что касается порядка по порядку - да, PostgresQL (и многие другие базы данных) не позволяет упорядочивать по столбцам, которые не перечислены в предложении select."

Просто не соответствует действительности.

=> ВЫБЕРИТЕ ИД ОТ ОТПРАВЛЕНИЯ t1 ПОЛЬЗОВАТЕЛЕМ LIMIT 5;

id

30 10 20 50 40 (5 рядов)

...