在PostgreSQL中搜索名称

时间:2017-02-11 19:26:05

标签: sql postgresql

我有用户表:id,first_name,last_name,...

使用数据:

  • 1,John,Doe
  • 2,Harry,Potter
  • 3,Alex,Brown
  • 4,James,Smith

我需要制作自动完成功能,当用户按下" H"时,结果必须只有三行,id为2的行必须是第一行,因为它包含" h"它以" h"开头,第二个必须是id为1的行,因为它包含" h"并且它在其他包含" h"之前,第三个应该是id为4的行,因为它包含" h"。

这个查询必须如何?

2 个答案:

答案 0 :(得分:2)

使用likeposition

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)