在PostgreSQL中查找字符串并按到字符串开头的距离排序
我试图编写一个查询,查找部分字符串,但顺序是根据字符串前面的接近程度。这是一个提前打印的应用程序 以下是我目前的查询:在PostgreSQL中查找字符串并按到字符串开头的距离排序,postgresql,Postgresql,我试图编写一个查询,查找部分字符串,但顺序是根据字符串前面的接近程度。这是一个提前打印的应用程序 以下是我目前的查询: SELECT DISTINCT ON (full_name) full_name FROM users WHERE (lower(full_name) LIKE 'q%' OR lower(full_name) LIKE '%q%') LIMIT 10 但它似乎不像我预期的那样有序 因此,如果我搜索“宠物”,我想在abigail peters之前返回peter smith和
SELECT DISTINCT ON (full_name) full_name
FROM users
WHERE (lower(full_name) LIKE 'q%' OR lower(full_name) LIKE '%q%')
LIMIT 10
但它似乎不像我预期的那样有序
因此,如果我搜索“宠物”,我想在abigail peters
之前返回peter smith
和petra glif
可以这样写where子句吗?我们目前没有在数据库中安装任何模糊文本搜索模块,因此如果可能的话,我希望避免这样做。您可以使用position(字符串中的子字符串)功能:
order by position(lower('pet') in lower(full_name))
您可以使用布尔表达式
全名,例如'q%'
作为排序顺序
SELECT *
FROM (
SELECT DISTINCT full_name
FROM users
WHERE full_name ILIKE '%q%'
) alias
ORDER BY full_name ILIKE 'q%' DESC, full_name
LIMIT 10
注意,对于不区分大小写的LIKE
,有ILIKE
操作符
您可能也对此感兴趣。我喜欢这个答案的外观,但我得到以下
错误:SELECT DISTINCT ON expressions必须按表达式匹配初始顺序
,一些谷歌搜索告诉我,我无法解决此问题。我编辑了上面的查询。获取我的查询并用David的建议替换order by
。如果你喜欢这个想法(我喜欢!),那么答案值得投票。