2009-08-17 147 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