Intereting Posts

проблема псевдонима столбца postgres

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

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 

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

У меня, вероятно, есть куча этих проблем – запросы отлично работали в mySql …

В 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 указано следующее:

Каждое выражение может быть именем или порядковым номером выходного столбца (элемент списка SELECT) или может быть произвольным выражением, сформированным из значений ввода-столбца .

Так что никаких псевдонимов при использовании выражения.

У тебя есть:

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

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

Обновить Ниже выберите (с = 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 

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

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

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

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

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

Просто неверно.

=> SELECT id FROM t1 ORDER BY владелец LIMIT 5;

Я бы

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