2011-08-24 90 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