Пользовательский ORDER BY игнорирует 'the'
Я пытаюсь сортировать список названий, но в настоящее время существует гигантский блок заголовков, который начинается с "The". Я бы хотел, чтобы "The" был проигнорирован, и сорт, чтобы отработать второе слово. Возможно ли это в SQL, или мне нужно выполнять пользовательскую работу на лицевой стороне?
Например, текущая сортировка:
- Самолет
- Дети мужчин
- Полная металлическая куртка
- Криминальное чтиво
- Фонтан
- Великий побег
- Королева
- Zardoz
Будет лучше отсортировано:
- Самолет
- Дети мужчин
- Фонтан
- Полная металлическая куртка
- Великий побег
- Криминальное чтиво
- Королева
- Zardoz
Почти как если бы записи были сохранены как "Фонтан, The" и тому подобное. Но я не хочу хранить их таким образом, если могу, что, конечно, является основной проблемой.
Ответы
Ответ 1
Лучше всего иметь вычисляемый столбец для этого, чтобы вы могли индексировать вычисленный столбец и упорядочивать его. В противном случае сортировка будет большой работой.
Итак, вы можете иметь свой вычисленный столбец как:
CASE WHEN title LIKE 'The %' THEN stuff(title,1,4,'') + ', The' ELSE title END
Изменить: если STUFF недоступен в MySQL, используйте RIGHT или SUBSTRING, чтобы удалить первые 4 символа. Но по возможности старайтесь использовать вычисленный столбец, чтобы индексирование могло быть лучше. Та же логика должна быть применима, чтобы вырвать "A" и "An".
Rob
Ответ 2
Что-то вроде:
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)))
Но, учитывая накладные расходы на выполнение этого более чем несколько раз, вам действительно лучше хранить значение сортировки заголовка в другом столбце...
Ответ 3
Я думаю, вы могли бы сделать что-то вроде
ORDER BY REPLACE(TITLE, 'The ', '')
хотя это заменит любое появление "The" на "", а не только первое "The", хотя я не думаю, что это сильно повлияло.
Ответ 4
Лучший способ справиться с этим - это иметь столбец, который содержит значение, которое вы хотите использовать специально для заказа вывода. Тогда вам просто нужно будет использовать:
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, чтобы содержать различные правила.
Ответ 5
Вы можете, конечно, организовать динамическое удаление "The", хотя вскоре вы обнаружите, что вам нужно иметь дело с "A" и "An" (за исключением специального случая с названиями типа "A для Alibi" ). Когда в микс попадают "иностранные" фильмы, вам нужно будет справиться с "Эль" и "Ла" (за исключением этого досадного края, "LA Story" ). Затем смешайте в некоторых немецких фильмах, и вам нужно будет справиться с "Der" и "Die" (за исключением этого досадного набора "Case Hard Hard" ). См. Шаблон? Вы направляетесь по пути, который продолжает становиться все более длинным и более острым в особых случаях.
Путь вперед по этому, который позволяет избежать постоянно растущего набора специальных случаев, заключается в том, чтобы сохранить заголовок так, как вы хотите, чтобы он отображал и сохранял заголовок, как вы хотите его сортировать.
Ответ 6
Пути, которые удаляют только первый The
:
=SUBSTITUTE(A1,"The ","",1) OR more reliably:
=IF(IF(LEFT(A1,4)="The ",TRUE)=TRUE,RIGHT(A1,(LEN(A1)-4)),A1)
Во-вторых, в основном говорят, что если первая левая цифра равна The
, тогда проверьте, сколько цифр находится в ячейке, и покажите только цифры правой руки, исключая The
.
Ответ 7
Для SQLite
ORDER BY CASE WHEN LOWER(SUBSTR(title,1,4)) = 'the ' THEN SUBSTR(title,5) ELSE title END ASC