Как сделать точное совпадение с последующим ORDER BY в PostgreSQL

Я пытаюсь написать запрос, который помещает некоторые результаты (в моем случае один результат) в верхнюю часть, а затем сортирует остальные. Я еще не нашел решение PostgreSQL.

Скажем, у меня есть стол с именем airports вот так.

 id | code |        display_name         
----+------+----------------------------
  1 | SDF  | International               
  2 | INT  | International Airport       
  3 | TES  | Test                        
  4 | APP  | Airport Place International

Короче говоря, у меня есть запрос в методе контроллера, который вызывается асинхронно, когда пользовательский текст ищет аэропорт либо code или же display_name, Тем не менее, когда пользователь вводит данные, соответствующие code точно (код аэропорта уникален), я хочу, чтобы этот результат появился первым, и все аэропорты, которые также имеют int в их display_name впоследствии будет отображаться в порядке возрастания. Если нет точного совпадения, он должен возвращать любые подстановочные совпадения, отсортированные по display_name по возрастанию. Так что, если пользователь вводит INT, Ряд (2, INT, International Airport) должен быть возвращен первым, а затем остальные:

Results:
1. INT | International Airport
2. APP | Airport Place International
3. SDF | International

Вот тот тип запроса, с которым я возился, немного упрощенный, чтобы иметь смысл вне контекста моего приложения, но, тем не менее, с той же концепцией.

SELECT * FROM airports
WHERE display_name LIKE 'somesearchtext%'
ORDER BY (CASE WHEN a.code = 'somesearchtext` THEN a.code ELSE a.display_name END)

Прямо сейчас результаты, если я наберу INT я собираюсь

Results:
1. APP | Airport Place International
2. INT | International Airport
3. SDF | International

мой ORDER BY должно быть неправильно, но я не могу понять, что любая помощь будет принята с благодарностью:)

2 ответа

Решение

Если вы хотите точное совпадение на code чтобы вернуться сначала, то я думаю, что это делает свое дело:

SELECT a.*
FROM airports a
WHERE a.display_name LIKE 'somesearchtext%'
ORDER BY (CASE WHEN a.code = 'somesearchtext' THEN 1 ELSE 2 END),
         a.display_name

Вы также можете написать это как:

ORDER BY (a.code = 'somesearchtext') DESC, a.display_name

Это не стандартный SQL, но он вполне читабелен.

Я думаю, что вы можете достичь своей цели с помощью союза. Сначала получите точное соответствие, а затем добавьте этот результат к остальным данным, которые вы.

например. (вам нужно будет немного поработать над этим)

SELECT * FROM airports
WHERE code == 'somesearchtext'
ORDER BY display_name 

UNION

SELECT * FROM airports
WHERE code != 'somesearchtext' AND display_name LIKE 'somesearchtext%'
ORDER BY display_name 
Другие вопросы по тегам