sql query for like to Order exact match at top in list

Viewed 440

sql query for like to show exact match first in list: dataset: "abcd", "a","b","bc","bcd"

select * from table where data like "%bc%";

it should show in order bc, abcd, bcd.

4 Answers

I think you can use a query like this one that can return your expected result.

select * from table where data='bc'
union all
select * from table where data like '%bc%' and data<>'bc' 

As you said - sort by match.

SQL> with test (col) as
  2    (select 'abcd' from dual union all
  3     select 'a'    from dual union all
  4     select 'b'    from dual union all
  5     select 'bc'   from dual union all
  6     select 'bcd'  from dual
  7    )
  8  select col
  9  from test
 10  where col like '%' || '&&par_search_string' ||'%'
 11  order by utl_match.jaro_winkler_similarity(col, '&&par_search_string') desc;
Enter value for par_search_string: bc

COL
----
bc
bcd
abcd

SQL> undefine par_search_string
SQL> /
Enter value for par_search_string: cd

COL
----
bcd
abcd

SQL>

One of many methods:

with
  t as (
    select 'abcd' c from dual union all
    select 'a'    from dual union all
    select 'b'    from dual union all
    select 'bc'   from dual union all
    select 'bcd'  from dual
  )
select *
from t
where c like '%bc%'
order by length(c)

Demo.

One method is:

select *
from t
where data like '%bc%'
order by (case when data = 'bc' then 1 else 2 end);

Or if you don't want to type so much:

order by nullif(data, 'bc') desc

The descending sort puts NULL values first.

Related