2010-07-15 3 views
8

यह ऊपर एक बहुत आता है, और मैं देख सकता हूँ यह XSLT, Ruby और Drupal के लिए StackOverflow पर आ रहा है, लेकिन मैं डॉन ' इसे विशेष रूप से एसक्यूएल के लिए देखें।कैसे एसक्यूएल में सॉर्ट करने के लिए, लेख अनदेखी (' "," एक', "एक" आदि)

तो सवाल यह है कि जब आप "द", "ए" या "एन" से शुरू होते हैं तो आप शीर्षक को सही तरीके से कैसे क्रमबद्ध करते हैं?

एक तरह से बस ट्रिम करने के लिए है() उन तार:

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

जो suggested on AskMeFi एक समय पहले किया गया था (यह है कि LOWER() समारोह की जरूरत है?)।

मुझे पता है कि मैंने इसके किसी भी प्रकार का केस/स्विच कार्यान्वयन भी देखा है लेकिन यह Google के लिए थोड़ा मुश्किल है।

जाहिर है कि कई संभावित समाधान हैं। एसक्यूएल गुरु का वजन क्या होगा, जिस पर प्रदर्शन प्रभाव पड़ता है।

+0

लिंक किए गए SO प्रश्नों में से एक पर एक टिप्पणीकर्ता के साथ सहमत हैं: नियम ऐसा लगता है उससे अधिक जटिल हो सकते हैं। उदाहरण के लिए, आपका विशेष सुझाव शायद निम्न सूची को सही तरीके से क्रमबद्ध करने में विफल रहेगा: 'एक टेस्ट', 'बी टेस्ट', 'सी टेस्ट'। –

उत्तर

6

एक दृष्टिकोण मैंने देखा है दो स्तंभ होने के लिए गया था - प्रदर्शन के लिए एक और अन्य छँटाई के लिए:

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

मैं किसी भी वास्तविक दुनिया परीक्षण नहीं किया है, लेकिन इस में सक्षम होने का लाभ है किसी इंडेक्स का उपयोग करने के लिए और विवरण के अनुसार हर बार स्ट्रिंग मैनिपुलेशन की आवश्यकता नहीं होती है। जब तक आपका डेटाबेस भौतिक दृश्यों का समर्थन नहीं करता है (जो MySQL नहीं करता है), तर्क में एक गणना कॉलम के रूप में तर्क को लागू करने से कोई लाभ नहीं मिलेगा क्योंकि आप गणना कॉलम को अनुक्रमित नहीं कर सकते हैं।

0

मैं केवल SQL सर्वर के लिए बोल सकता हूं: आप CASE कथन के भीतर एलटीआरआईएम का उपयोग करते हैं। कोई लोअर फ़ंक्शन की आवश्यकता नहीं है क्योंकि चयन डिफ़ॉल्ट रूप से संवेदनशील नहीं होते हैं। हालांकि, अगर आप लेखों को अनदेखा करना चाहते हैं तो मैं सुझाव दूंगा कि आप शोर शब्दकोष का उपयोग करें और एक पूर्ण टेक्स्ट इंडेक्सिंग कैटलॉग सेट करें। मुझे यकीन नहीं है कि अन्य कार्यान्वयन एसक्यूएल इसका समर्थन करते हैं।

+0

केस संवेदनशीलता संयोजन पर निर्भर है। पूर्ण पाठ खोज (एफटीएस) MySQL, ओरेकल, एसक्यूएल सर्वर पर उपलब्ध है ... डोनो क्या PostgreSQL है लेकिन मुझे यकीन है कि इसकी मूल कार्यक्षमता है। और तीसरे पक्ष के एफटीएस जैसे स्फिंक्स हैं ... –

+0

"आप सीएएसई कथन के भीतर एलटीआरआईएम का उपयोग करते हैं" - क्या इसका मतलब यह है कि आप "अगर यह 'से शुरू होता है, तो इसे ट्रिम करें" के बराबर करते हैं? मैं सोच रहा था कि क्या यह प्रक्रिया को धीमा कर देगी, क्योंकि एक कंबल टीआरआईएम() के विपरीत जो अधिकतर समय में असफल हो सकता है। – AmbroseChapel

+0

एलटीआरआईएम प्रमुख रिक्त स्थान से छुटकारा पाता है – CarneyCode

-1

LOWER आवश्यक है। जबकि SELECT केस-संवेदी नहीं है, ORDER BY है।

-3

प्रयास करें निम्नलिखित:

द्वारा आदेश की जगह (की जगह (की जगह (YOURCOLUMN, '', ''), 'एक \' ',' '),' एक ',' ')

परीक्षण नहीं किया गया!

+1

आश्चर्यचकित किसी ने इस समस्या को समझाया नहीं है। सॉर्ट करते समय, आप अग्रणी लेखों को प्रतिस्थापित करना चाहते हैं, जबकि यह सभी लेखों को प्रतिस्थापित करेगा। –

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; 

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^