Пользовательский ORDER BY для игнорирования

Это могло бы немного отличаться от того, что было отправлено до сих пор и не может быть точно, что Вы ищете, но я думал, что добавлю его, если ни для чего иного кроме другого подхода. Я пошел с объектно-ориентированным подходом. То, что я сделал, было, создают систему, которая инкапсулирует файлы языка в класс путем хранения их в массиве строки => пары перевода. Доступ к переводу через названный метод, переводят со строкой ключа в качестве параметра. Расширяющиеся классы наследовали массив языка родителя и могут добавить к нему или перезаписать его. Поскольку классы расширяемы, можно изменить базовый класс и иметь изменения, распространяют через детей, делая более удобным в сопровождении, чем массив отдельно. Плюс, Вы только называете классы, в которых Вы нуждаетесь.

15
задан dimo414 17 August 2009 в 01:40
поделиться

5 ответов

Лучше всего иметь для этого вычисляемый столбец, чтобы вы могли индексировать вычисляемый столбец и упорядочивать по нему. В противном случае сортировка потребует много работы.

Итак, вы можете иметь свой вычисляемый столбец как:

CASE WHEN title LIKE 'The %' THEN stuff(title,1,4,'') + ', The' ELSE title END

Изменить: Если STUFF недоступен в MySQL, то используйте RIGHT или SUBSTRING, чтобы удалить первые 4 символа. Но по-прежнему старайтесь использовать вычисляемый столбец, если это возможно, чтобы индексирование было лучше. Та же самая логика должна быть применима для выделения «А» и «Ан».

Роб

12
ответ дан 1 December 2019 в 01:53
поделиться

Что-то вроде:

ORDER BY IF(LEFT(title,2) = "A ",
            SUBSTRING(title FROM 3),
            IF(LEFT(title,3) = "An ",
              SUBSTRING(title FROM 4),
              IF(LEFT(title,4) = "The ",
                 SUBSTRING(title FROM 5),
                 title)))

Но, учитывая накладные расходы, связанные с выполнением этого более чем несколько раз, вам действительно лучше сохранить значение сортировки заголовка в другом столбце ...

9
ответ дан 1 December 2019 в 01:53
поделиться

Я думаю, вы могли бы сделать что-то вроде

ORDER BY REPLACE(TITLE, 'The ', '')

, хотя это заменило бы любое появление «The» на «», а не только первое «The», хотя я не думаю, что это влияют очень сильно.

4
ответ дан 1 December 2019 в 01:53
поделиться

Лучший способ справиться с этим - иметь столбец, содержащий значение, которое вы хотите использовать специально для упорядочивания вывода. Тогда вам просто нужно будет использовать:

  SELECT t.title
    FROM MOVIES t
ORDER BY t.order_title

Существуют различные правила о том, что следует и не следует использовать для упорядочивания заголовков.

На основе вашего примера альтернативой может быть использование чего-то вроде:

   SELECT t.title
    FROM MOVIES t
ORDER BY SUBSTR(t.title, INSTR(t.title, 'The '))

Вы можете использовать оператор CASE, чтобы содержать различные правила.

3
ответ дан 1 December 2019 в 01:53
поделиться

Вы, конечно, можете настроить динамическое удаление 'The', хотя вскоре вы обнаружите, что вам придется иметь дело с 'A' и 'An' (за исключением особого случая заголовков типа «A означает Алиби»). Когда в микс входят «иностранные» фильмы, вам нужно будет справиться с «Эль» и «Ла» (за исключением этого надоедливого крайнего случая «LA Story»). Затем добавьте несколько немецких фильмов, и вам нужно будет справиться с «Der» и «Die» (за исключением этого надоедливого набора крайних случаев «Крепкий орешек»). Видите узор? Вы идете по пути, который становится все длиннее и изобилует особыми случаями.

3
ответ дан 1 December 2019 в 01:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: