2009-08-17 109 views
15

我试图对一个标题列表进行排序,但目前有一个以'The'开头的巨型块标题。我希望'The'被忽略,并且排除第二个单词。这是可能的SQL,或者我必须在前端做定制工作吗?自定义ORDER BY忽略'''

例如,当前排序:

  • 飞机
  • 男性
  • 金甲
  • 低俗小说
  • 喷泉
  • 大逃亡
  • 女王的儿童
  • Zardoz

将得到更好的分类:

  • 飞机
  • 人类之子
  • 喷泉
  • 金甲
  • 大逃亡
  • 低俗小说
  • 女王
  • Zardoz

仿佛记录被存储为“喷泉的”,等等。但是,如果可以的话,我不想那样存储它们,这当然是问题的关键。

+1

谢谢你提醒我关于Zardoz。现在我要做一些关于浮动头的恶梦。 – MusiGenesis 2009-08-17 01:51:15

+0

我很高兴有人发现:D – dimo414 2009-08-17 02:21:11

+0

现在,全金属外套,有一部很棒的电影。或者正如我想对我的日期说的那样:“我是...在一个世界上...... $#!+”。 – MusiGenesis 2009-08-17 16:23:58

回答

12

最好是有一个计算列来做到这一点,这样你就可以通过它来索引计算列和顺序。否则,排序将是很多工作。

,那么你可以有你的计算列:

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

编辑:如果东西还提供MySQL的,然后使用权或子删除前导4个字符。但如果可能的话,仍然尝试使用计算列,以便索引更好。撕掉“A”和“An”的逻辑应该是相同的。

罗布

+2

您可能还想在排序列中将其全部设置为小写,以获得不区分大小写的排序(和搜索) – Thilo 2009-08-17 01:49:56

+1

是的,如果您遇到区分大小写的情况。但我认为,作为电影标题,这种情况可能在输入中受到控制,因此您不需要通过基于小写字母的等价字符查找记录来获得与性能相关的效果。 – 2009-08-17 02:45:23

4

我想你可以做这样的事情

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

虽然这将取代“的”与“”,不只是第一“的”任何发生,但我不认为这会影响很许多。

+0

嗯,我也不喜欢我的想法,但至少要说明这不是最好的解决方案还是它不会运行。 – MusiGenesis 2009-08-17 01:53:58

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

但考虑到多几次这样做更多的开销,你真的是最好存储在另一列标题排序值...

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

3

你当然可以安排动态脱光“的”,但你很快就会发现,你必须处理“A”和“一个”(除了像“A是不在犯罪现场”称号的特殊情况) 。当“外国”电影参与混音时,您需要应对“El”和“La”(除了那个讨厌的边缘案例,“LA Story”)。然后混合一些德国电影,你需要应付'Der'和'Die'(除了那些讨厌的'Die Hard'边缘案例外)。看到模式?你正走向一条不断变长的道路,更有特殊情况。

避免日益增多的特殊情况的前进方向是将标题存储为您想要显示的将标题存储为您想要的排序方式。

+0

非常好的一点,虽然幸运的是我的用例完美并不是必需的,所以那些边缘案例可以被忽略,至少现在是如此。 +1虽然提到这个问题。 – dimo414 2009-08-30 09:32:42

0

SQLite的

ORDER BY CASE WHEN LOWER(SUBSTR(title,1,4)) = 'the ' THEN SUBSTR(title,5) ELSE title END ASC 
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