Пользовательский SQL сортировать по - PullRequest
4 голосов
/ 08 марта 2011

Использование: пользователь ищет частичный почтовый индекс, например «RG20», который затем должен отображаться в определенном порядке.Запрос использует метод MATCH AGAINST в логическом режиме, где примером почтового индекса в базе данных будет «RG20 7TT», чтобы он мог его найти.В то же время он также сопоставляется со списком других почтовых индексов, которые находятся в его радиусе (это отдельный запрос).

Я не могу найти способ заказа путем частичного совпадения, например:

ORDER BY FIELD(postcode, 'RG20', 'RG14', 'RG18','RG17','RG28','OX12','OX11') 
      DESC, city DESC

Поскольку он не ищет RG20 7TT, я не думаю, что он может частично соответствовать.

Я пробовал SUBSTR (почтовый индекс, -4) и посмотрел налево.и правильно, но я не имел никакого успеха, используя «по полю» и не мог найти другой маршрут ... Извините, это немного затянуто, но я немного затруднен.Почтовый индекс в Великобритании разделен на 2 части, последний раздел всегда состоит из 3 символов, и в моей базе данных между ними есть пробел, если это вообще помогает.

Хотя после почтовых индексов есть DESC, мне нужноони отображаются в определенном порядке (RG20, RG14, затем RG18 и т. д.). Я не уверен, удалит ли указание по убыванию порядок или нет

Ответы [ 4 ]

11 голосов
/ 08 марта 2011
Order By Case
            When postcode Like 'RG20%' Then 1
            When postcode Like 'RG14%' Then 2
            When postcode Like 'RG18%' Then 3
            When postcode Like 'RG17%' Then 4
            When postcode Like 'RG28%' Then 5
            When postcode Like 'OX12%' Then 6
            When postcode Like 'OX11%' Then 7
            Else 99
            End Asc
    , City Desc
5 голосов
/ 08 марта 2011

Вы на правильном пути, обрезая поле до первых четырех символов:

ORDER BY FIELD(LEFT(postcode, 4), 'RG20', 'RG14', ...),
--          or SUBSTRING(postcode FROM 1 FOR 4)
--          or SUBSTR(postcode, 1, 4)

Здесь вам не нужен DESC.

(Если ваш набор результатов содержитПочтовые индексы, префиксы которых , а не , появляются в вашем списке упорядочивания FIELD (), у вас будет немного больше работы, поскольку в противном случае эти записи будут появляться перед указанными вами явно упорядоченными записями. Перед RG20 впример выше.)

2 голосов
/ 08 марта 2011

Если вам нужна полностью настраиваемая схема сортировки, я вижу только один способ сделать это ... Создайте таблицу для хранения значений для сортировки и включите поле «sequence» или «sort_order». Затем вы можете присоединиться к этой таблице и отсортировать по полю последовательности.

Одна заметка в поле последовательности. Имеет смысл создать его как int, так как ... ну, последовательности часто являются целыми :) Если есть любая возможность изменить порядок сортировки, вы можете рассмотреть возможность сделать его буквенно-цифровым ... Гораздо проще вставить "5А" между "5 и" 6, чем вставить число в последовательность целых чисел.

1 голос
/ 06 марта 2013

Другой метод, который я использую, это использование функции charindex :

order by charindex(substr(postcode,4,1),"RG20RG14RG18...",1)

Я думаю, что в любом случае это синтаксис, сейчас я просто делаю это в SAS, поэтому мне пришлось адаптироваться из памяти!
Но, по сути, чем раньше вы нажмете нужную часть строки, тем выше звание.

Если вы пытаетесь ранжироваться по большому количеству почтовых индексов, тогда выражение case становится довольно здоровенным.

...