2010-07-15 33 views
8

這出現了很多,我可以看到它出現在StackOverflow的XSLT,RubyDrupal但我不'不要專門爲SQL查看它。如何在SQL中排序,忽略文章('the「,」a「,」an「等)

所以問題是,當他們以「The」,「A」或「An」開頭時,如何正確地分類標題?

一種方法是簡單地TRIM()這些字符串:

ORDER BY TRIM( 
    LEADING 'a ' FROM 
    TRIM( 
    LEADING 'an ' FROM 
    TRIM( 
     LEADING 'the ' FROM LOWER(title) 
    ) 
    ) 
) 

這是suggested on AskMeFi而回(它需要的是LOWER()功能?)。

我知道我也看到過某種Case/Switch的實現,但對Google來說有點難。

顯然有一些可能的解決方案。有什麼是好的是SQL的權重,其中有性能影響。我見過

+0

同意一個鏈接SO問題的評論者:規則可能會變得比看起來更復雜。例如,你的特別建議可能無法正確地對以下列表進行排序:「A測試」,「B測試」,「C測試」。 – 2011-09-12 19:54:26

回答

6

一種方法是有兩列 - 一個用於顯示和其他排序:

description | sort_desc 
---------------------------- 
The the  | the, The 
A test   | test, A 
I, Robot  | i, Robot 

我沒有做過任何真實世界的測試,但這種具有能夠受益要使用索引並且不需要每次要按說明進行排序時的字符串操作。除非你的數據庫支持實體化視圖(MySQL不支持),否則在視圖中將邏輯實現爲計算列不會帶來任何好處,因爲您無法爲計算列建立索引。

0

我只能說SQL Server:在CASE語句中使用LTRIM。不需要LOWER功能,因爲默認情況下選擇不區分大小寫。然而,如果你想忽略文章,那麼我會建議你使用一個噪音詞典並設置一個全文索引目錄。我不確定其他實現是否支持SQL。

+0

區分大小寫取決於整理。全文搜索(FTS)可用於MySQL,Oracle,SQL Server ...不知道PostgreSQL是什麼,但我確信它具有本地功能。還有像斯芬克斯這樣的第三方FTS ... – 2010-07-15 05:22:54

+0

「你在CASE語句中使用LTRIM」 - 這是否意味着你做了相當於「如果它開始於',修剪它'?我想知道這是否會減緩這個過程,而不是大部分時間內可能會失敗的毛坯TRIM()。 – AmbroseChapel 2010-07-15 23:53:39

+0

LTRIM擺脫領先空間 – CarneyCode 2010-08-07 05:53:19

-1

LOWER是必要的。而SELECT不區分大小寫,ORDER BY是。

-3

嘗試以下方法:

ORDER BY 更換(更換(替換(YOURCOLUMN, '的', ''), '一個\'」, ''), '一個', '')

未經測試!

+1

驚訝沒有人解釋了這個問題。排序時,您要替換LEADING文章,而這將取代所有文章。 – 2015-09-17 15:11:48

2

我已經使用了多年,但不記得在那裏我發現:

SELECT 
CASE 
    WHEN SUBSTRING_INDEX(Title, ' ', 1) IN ('a', 'an', 'the') 
    THEN CONCAT(SUBSTRING(Title, INSTR(Title, ' ') + 1), ', ', SUBSTRING_INDEX(Title, ' ', 1)) 
    ELSE Title 
    END AS TitleSort, 
Title AS OriginalTitle 
FROM yourtable 
ORDER BY TitleSort 

產量:

TitleSort     | OriginalTitle 
------------------------------------------------------ 
All About Everything  | All About Everything 
Beginning Of The End, The | The Beginning Of The End 
Interesting Story, An  | An Interesting Story 
Very Long Story, A   | A Very Long Story 
0

Postgres的具體情況,你可以使用REGEXP_REPLACE做爲你工作:

BEGIN; 
CREATE TEMPORARY TABLE book (name VARCHAR NOT NULL) ON COMMIT DROP; 
INSERT INTO book (name) VALUES ('The Hitchhiker’s Guide to the Galaxy'); 
INSERT INTO book (name) VALUES ('The Restaurant at the End of the Universe'); 
INSERT INTO book (name) VALUES ('Life, the Universe and Everything'); 
INSERT INTO book (name) VALUES ('So Long, and Thanks for All the Fish'); 
INSERT INTO book (name) VALUES ('Mostly Harmless'); 
INSERT INTO book (name) VALUES ('A book by Douglas Adams'); 
INSERT INTO book (name) VALUES ('Another book by Douglas Adams'); 
INSERT INTO book (name) VALUES ('An omnibus of books by Douglas Adams'); 

SELECT name FROM book ORDER BY name; 
SELECT name, regexp_replace(lower(name), '^(an?|the) (.*)$', '\2, \1') FROM book ORDER BY 2; 
SELECT name FROM book ORDER BY regexp_replace(lower(name), '^(an?|the) (.*)$', '\2, \1'); 
COMMIT; 
相關問題