Как сделать точное совпадение с последующим 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