MySQL按字母顺序排序但忽略“The”

时间:2012-01-31 21:59:35

标签: mysql

我有一个MySQL数据库,里面有一个包含书籍数据的表格。表中的一列称为“标题”。有些标题的开头是“the”,有些则没有。

示例:

  • “书名一”
  • “书名二”
  • “书名三”

我需要按字母顺序从数据库中提取这些内容,但我需要忽略以它开头的标题开头的“the”。

SQL(特别是MySQL)是否提供了在查询中执行此操作的方法?

6 个答案:

答案 0 :(得分:9)

确定何时检查列值是否以及如果是,则返回标题而不是“The”。这将是您稍后将用于排序顺序的新列

select title, case when title like 'The %' then trim(substr(title from 4)) else title end as title2 from tablename order by title2;

答案 1 :(得分:5)

您可以在CASE中使用ORDER BY语句,并使用REGEXPLIKE来匹配以您要删除的字词开头的字符串。

在下面的示例中,我发现所有以 a a 后跟空格开头的单词,然后删除所有内容直到空间,并修剪掉额外的空白区域(在 的实例后可能有两个或多个空格。)

SELECT *
FROM books
ORDER BY 
  CASE 
    WHEN title REGEXP '^(A|An|The)[[:space:]]' = 1 THEN 
      TRIM(SUBSTR(title , INSTR(title ,' '))) 
    ELSE title
  END ;

答案 2 :(得分:4)

如果你确定你永远不会有拼写错误(并使用小写而不是大写)

select *
from books b 
order by UPPER(LTRIM(Replace(b.Title, 'The', '')))

否则你的排序将完成所有Upper,然后全部降低。

例如,这是升序:

Have a Great Day
Wild west
Zorro
aZtec fries are hotter
alfred goes shopping
bart is small
will i am not

改编自AJP的回答

答案 3 :(得分:1)

select *
from books b 
order by LTRIM(Replace(b.Title, 'The', ''))

请注意,这将取代标题中的标题..无论标题在何处。所以使用substring来获得前3个字符。

答案 4 :(得分:1)

我在这里看到了一些错综复杂的答案我尝试但是错误(不起作用)或不安全(取代每次出现的'the')。我认为这个解决方案很简单,或者说我弄错了或不考虑边缘情况(真诚地,没有讽刺意图)。

... ORDER BY SUBSTRING(UPPER(fieldname), IF(fieldname LIKE 'The %', 5, 1))

正如其他地方所述,UPPER只是阻止在a之前命令B的ASCII排序(注意大小写差异)。

当只有一个条件时,switch-case不需要IF()语句,{{1}}会做

我正在使用MySQL 5.6,似乎字符串函数是1索引的,相比之下,PHP表示字符串为0索引(这引起了我的注意)。我已在我的数据集上测试了上述内容,可行

答案 5 :(得分:0)

简单地:

SELECT Title
FROM book
ORDER BY IF(Title LIKE "The %", substr(Title, 5), Title);

说明:

我们使用IF函数从字符串的开头剥离“The”(如果存在),然后将字符串返回到ORDER BY子句。对于更复杂的字母顺序规则,我们可以创建一个用户定义的函数,并将其放在ORDER BY子句中。然后你会...ORDER BY MyFunction(Title)