我有用户表:id,first_name,last_name,...
使用数据:
我需要制作自动完成功能,当用户按下" H"时,结果必须只有三行,id为2的行必须是第一行,因为它包含" h"它以" h"开头,第二个必须是id为1的行,因为它包含" h"并且它在其他包含" h"之前,第三个应该是id为4的行,因为它包含" h"。
这个查询必须如何?
答案 0 :(得分:2)
使用like
和position
:
select t.name
from t
where lower(t.name) like '%h%'
order by position('h' in t.name);
编辑:
我注意到您的查询有两个名称字段。只需将它们连接在一起:
select t.first_name, t.last_name
from t
where lower(t.first_name || ' ' || t.last_name) like '%h%'
order by position('h' in t.first_name || ' ' || t.last_name);
注意:连接中不需要空格。它似乎对我有意义。
答案 1 :(得分:1)
使用strpos()
:
with my_table(id, name, surname) as (
values
(1, 'John', 'Doe'),
(2, 'Harry', 'Potter'),
(3, 'Alex', 'Brown'),
(4, 'James', 'Smith')
)
select id, name, surname
from (
select *, strpos(lower(name), 'h') p1, strpos(lower(surname), 'h') p2
from my_table
) s
where p1 <> 0 or p2 <> 0
order by case p1
when 0 then p2
else case p2
when 0 then p1
else least(p1, p2)
end
end;
id | name | surname
----+-------+---------
2 | Harry | Potter
1 | John | Doe
4 | James | Smith
(3 rows)