Расширенный MySQL по алфавиту с префиксом? - PullRequest
3 голосов
/ 24 августа 2011

Извинения, если на этот вопрос уже был дан ответ, я уже провел обширный поиск, но не нашел ответа (возможно, потому что я не уверен, как он правильно сформулирован?)

Можно ли сделать алфавитный sort_by с заданным префиксом? Например, у меня есть список университетов в таблице. Некоторые университеты имеют префикс University of (например, Кембриджский университет), а другие нет (например, Университет Дарема). Можно ли определить префикс для игнорирования MySQL?

В качестве примера приведен следующий список

University of Cambridge
University of Bristol
Durham University
kings College London

следует заказать до

University of Bristol
University of Cambridge
Durham University
Kings College London

Ответы [ 4 ]

3 голосов
/ 24 августа 2011

Вы можете сделать это:

ORDER BY IF(SUBSTRING(name, 1, 14) = 'University of ', SUBSTRING(name, 15), name)

Возможно, было бы неплохо создать представление для этой таблицы, проецируя дополнительный столбец name_value, для которого установлено выражение IF() выше. Затем вы можете сделать заказ по этому столбцу и выбрать его, не загрязняя ваши запросы IF().


Пример представления, предполагая, что название университета хранится в столбце name:

CREATE VIEW Universities AS
    SELECT
        list_universities.*,
        IF(SUBSTRING(name, 1, 14) = 'University of ',
           SUBSTRING(name, 15),
           name) AS name_value
    FROM list_universities;

Затем вы можете выбрать из Universities так же, как и из list_universities, за исключением того, что у него будет дополнительный столбец name_value, который вы можете выбрать, или упорядочить, или как угодно.

Обратите внимание, что этот подход (а также ORDER BY IF(...)) не сможет использовать какой-либо индекс на name для повышения производительности сортировки.

1 голос
/ 24 августа 2011

один из возможных способов

order by replace(display_name, 'University of', '');

однако применение функции для изменения значения столбца приведет к тому, что mysql
будет игнорировать индекс, часто люди считают, что нужно дублировать другой столбец,
и этот столбец обычно удаляет ненужные слова
(или упорядочивает значение таким образом, чтобы сортировка могла работать)

, предполагая, что чистое поле называется order_name,
itдолжен состоять из

Bristol, University
Cambridge, University
Durham, University
Kings College Cambridge
Kings College London

, поэтому SQL может быть

select display_name 
from tables
order by order_name;
1 голос
/ 24 августа 2011

Можно попробовать

ORDER BY REPLACE(LOWER(fieldName), 'university of', '')
0 голосов
/ 24 августа 2011

Я собрал это вместе в SQL Management Studio, поэтому я предполагаю, что это действительный MySql (например, я избегал использовать 'with')

SELECT UniversityName, REPLACE(UniversityName, 'University of', '') AS cleanName 
FROM Universities c
ORDER BY cleanName
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...