我正在尝试对标题列表进行排序,但目前有一大块标题以“The”开头。我希望忽略'The',以及解决第二个词的问题。这可能在SQL中,还是我必须在前端进行自定义工作?
例如,当前排序:
会更好地排序:
几乎就像记录存储为'Fountain,The'等。但是如果可以的话,我不想那样存储它们,这当然是问题的症结所在。
答案 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