自定义ORDER BY忽略'the'

时间:2009-08-17 01:40:46

标签: sql mysql sorting

我正在尝试对标题列表进行排序,但目前有一大块标题以“The”开头。我希望忽略'The',以及解决第二个词的问题。这可能在SQL中,还是我必须在前端进行自定义工作?

例如,当前排序:

  • 飞行
  • 男人子女
  • 全金属外套
  • 纸浆小说
  • The Fountain
  • The Great Escape
  • 女王
  • Zardoz

会更好地排序:

  • 飞行
  • 男人子女
  • The Fountain
  • 全金属外套
  • The Great Escape
  • 纸浆小说
  • 女王
  • Zardoz

几乎就像记录存储为'Fountain,The'等。但是如果可以的话,我不想那样存储它们,这当然是问题的症结所在。

7 个答案:

答案 0 :(得分:12)

最好是有一个计算列来执行此操作,以便您可以索引计算列并按此顺序。否则,排序将是很多工作。

那么您可以将计算列作为:

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

编辑:如果MySQL中没有STUFF,则使用RIGHT或SUBSTRING删除前4个字符。但是如果可能的话,仍然尝试使用计算列,以便索引可以更好。撕掉“A”和“An”应该适用相同的逻辑。

罗布

答案 1 :(得分:9)

类似的东西:

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)))

但考虑到执行此操作的开销超过几次,您最好将标题排序值存储在另一列中...

答案 2 :(得分:4)

我认为你可以做点什么

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

虽然这会取代任何'''与''的出现,而不仅仅是第一次出现'',尽管我认为这不会影响很多。

答案 3 :(得分:3)

处理此问题的最佳方法是使列包含您要专门用于排序输出的值。然后你只需要使用:

  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语句来包含各种规则。

答案 4 :(得分:3)

你当然可以安排动态剥离'The',虽然你很快就会发现你必须处理'A'和'An'(除了“A代表Alibi”等标题的特殊情况)。当“外国”电影进入混音时,你需要应对“El”和“La”(除了那个讨厌的边缘案例,“洛杉矶故事”)。然后混合一些德国电影,你需要应对'Der'和'Die'(除了那些讨厌的'Die Hard'边缘案例)。看模式?你走的是一条不断变长的道路,而且会遇到特殊情况。

这种避免不断增长的特殊情况的前进方法是存储标题,因为你希望它显示存储你想要的标题。

答案 5 :(得分:1)

只删除第一个The

的方式
=SUBSTITUTE(A1,"The ","",1) OR more reliably: 

=IF(IF(LEFT(A1,4)="The ",TRUE)=TRUE,RIGHT(A1,(LEN(A1)-4)),A1)

第二个基本上是说第一个左数字是否等于The,然后检查单元格中有多少个数字,并仅显示除The之外的右手数字。

答案 6 :(得分:0)

对于SQLite

ORDER BY CASE WHEN LOWER(SUBSTR(title,1,4)) = 'the ' THEN SUBSTR(title,5) ELSE title END ASC