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