我有一个MySQL数据库,里面有一个包含书籍数据的表格。表中的一列称为“标题”。有些标题的开头是“the”,有些则没有。
示例:
我需要按字母顺序从数据库中提取这些内容,但我需要忽略以它开头的标题开头的“the”。
SQL(特别是MySQL)是否提供了在查询中执行此操作的方法?
答案 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
语句,并使用REGEXP
或LIKE
来匹配以您要删除的字词开头的字符串。
在下面的示例中,我发现所有以 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)
。