У вас есть два варианта:
- сделать союз
- написать функцию и использовать ее для упорядочения строк по
В первом случае вы могли бы сделать что-то вроде
select 1 as res_order, ...
...
where state like 'hi%'
union
select 2 as res_order, ...
...
where state not like 'hi%'
order by res_order asc, id desc
Во втором случае вы могли бы сделать что-то вроде
select my_function(state, "hi") as row_order, ...
...
order by row_order
где функция возвращает более низкие значения для соответствующих состояний.
Код не в моей голове: для его запуска может потребоваться некоторая настройка.