Пользовательский 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