2011-08-24 136 views
3

如果这个问题已经回答道歉,我已经做了大量的搜索,但没有遇到一个答案(可能是因为我不知道它是如何措辞正确的?)高级MySQL按字母排序前缀?

是否有可能使用设置的前缀按字母顺序排列sort_by?例如,我有一张表格中的大学名单。一些大学的前缀是University of(例如剑桥大学),而其他大学则不是(例如达勒姆大学)。是否有可能为MySQL定义一个前缀来忽略?

作为一个例子,下面的列表

University of Cambridge 
University of Bristol 
Durham University 
kings College London 

应当责令

University of Bristol 
University of Cambridge 
Durham University 
Kings College London 
+0

哇,这很快,非常感谢所有的答案,我会尝试你的建议,并尽快回复。 – emkay

回答

3

你可以这样做:

ORDER BY IF(SUBSTRING(name, 1, 14) = 'University of ', SUBSTRING(name, 15), name) 

这可能是创造一个好主意查看此表格预测额外的name_value列设置为IF()表达式abov即然后,您可以通过此列进行订购,并选择它,而不必通过IF()污染您的查询。


例子来看,假设这所大学的名字被存储在列name

CREATE VIEW Universities AS 
    SELECT 
     list_universities.*, 
     IF(SUBSTRING(name, 1, 14) = 'University of ', 
      SUBSTRING(name, 15), 
      name) AS name_value 
    FROM list_universities; 

然后你可以从Universities选择从list_universities做同样的方式,但它会有一个额外的name_value列,你可以选择,或按顺序,或其他。

请注意,此方法(以及ORDER BY IF(...))将无法使用name上的任何索引来提高排序的性能。

+0

感谢您向我介绍意见!我以前不知道他们。这是创建这个特定视图的正确语法吗? 'CREATE VIEW [Universities] AS SELECT SUBSTRING(name,1,14)='University of',SUBSTRING(name,15),name FROM list_universities' – emkay

+0

您需要省略[['和']'字符名字。否则,是的 - 但请注意,这将只创建一列的视图。查看我更新的CREATE VIEW语句的答案。 – cdhowie

+0

非常感谢 – emkay

1

您可以尝试

ORDER BY REPLACE(LOWER(fieldName), 'university of', '') 
1

的可能途径

order by replace(display_name, 'University of', ''); 

然而一个,应用功能来改变列意志的价值,导致指数由mysql忽视
人们往往会考虑以复制另一列,
并且此列通常会剥离那些不需要的字词
(或安排值进入方式排序可以工作)

假设干净场被命名为order_name
它应该由

Bristol, University 
Cambridge, University 
Durham, University 
Kings College Cambridge 
Kings College London 

这样,SQL可能是

select display_name 
from tables 
order by order_name; 
0

我把这一起放在SQL管理工作室,所以我认为这是有效的MySql(我避免使用'与'例如)

SELECT UniversityName, REPLACE(UniversityName, 'University of', '') AS cleanName 
FROM Universities c 
ORDER BY cleanName