2011-08-10 15 views
8

इस क्वेरी चल रहा है:Postgresql छँटाई मिश्रित अक्षरांकीय डेटा

select name from folders order by name 

रिटर्न इन परिणामों:

alphanumeric 
a test 
test 20 
test 19 
test 1 
test 10 

लेकिन मैं उम्मीद:

a test 
alphanumeric 
test 1 
test 10 
test 19 
test 20 

यहाँ क्या गलत है?

+1

यह अजीब लगता है: 'परीक्षण 20' <'test 19''। 'SHC lc_collate;' की जांच करके आपके पास क्या 'LC_COLLATE' है? मेरे पास 'en_US.UTF-8' है और यह 'ASDER नाम ASC' के साथ बिल्कुल वांछित आउटपुट देता है। –

+0

मुझे भी वही चीज़ मिलती है। मैंने अभी 'अल्फान्यूमेरिक' <'test' का चयन किया है और 'f'' प्राप्त किया है। रिकॉर्ड के लिए –

+1

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

उत्तर

3

आप मामले में पाठ विभाजित करके मैन्युअल तरह करने में सक्षम हो सकता है वहाँ अंकों के पीछे चल रही है, इसलिए जैसे:

SELECT * FROM sort_test 
ORDER BY SUBSTRING(text FROM '^(.*?)(\\d+)?$'), 
     COALESCE(SUBSTRING(text FROM ' (\\d+)$')::INTEGER, 0); 

यह कॉलम पाठ पर सॉर्ट होगा, पहले सभी पात्रों द्वारा वैकल्पिक रूप से पीछा किया एक अंतिम अंतरिक्ष को छोड़कर अंकों के द्वारा, फिर उन वैकल्पिक अंकों से।

मेरे परीक्षण में अच्छी तरह से काम किया।

अद्यतन एक सरल coalesce (duh) के साथ स्ट्रिंग-केवल सॉर्टिंग को ठीक किया गया।

+0

डाउनवोट क्यों? यह काम करता है, और स्थिति हल करता है। यह * सर्वोत्तम * समाधान नहीं है, लेकिन इसमें डेटाबेस संरचना को बदलने में शामिल नहीं है। यदि आपको डाउनवोट की आवश्यकता महसूस होती है तो कम से कम टिप्पणी करें। – OverZealous

+0

-1 विचित्र क्लेज के लिए जो वास्तविक समस्या को हल नहीं करता है। (एकाधिक रिक्त स्थान और/या संख्याओं के साथ तारों के बारे में क्या?) उपरोक्त टिप्पणियों को उपरोक्त के बारे में देखें। –

+0

मैं यह नहीं कहूंगा कि यह एक * विचित्र क्लेज * है। यह पीजी के विशिष्ट संस्करण की आवश्यकता के बिना संख्यात्मक रूप से पिछली संख्याओं को क्रमबद्ध करने की क्षमता को जोड़ता है। यह * पीछे * संख्याओं को बहुत अच्छी तरह से संभालता है, इसलिए अनुक्रमिक रूप से क्रमांकित फ़ोल्डर्स के लिए अच्छा काम करता है। यह कई रिक्त स्थानों को संभालता है, क्योंकि यह केवल यह सुनिश्चित करने के लिए जांच कर रहा है कि पीछे वाले अंकों से कम से कम एक स्थान हो। यदि आपने इसे आजमाया है, तो आप इसे मानने के बजाय काम करेंगे। – OverZealous

16

आप बस डाली कर सकते हैं name स्तंभ bytea लिए डेटा प्रकार की इजाजत दी मुक़ाबला-अज्ञेयवाद आदेश:

SELECT name 
FROM folders 
ORDER BY name::bytea; 

परिणाम:

 name  
-------------- 
a test 
alphanumeric 
test 1 
test 10 
test 19 
test 20 
(6 rows) 
+1

मास्टर के लिए नहीं! यह जवाब निश्चित रूप से मैं पिछले 2 घंटों के लिए खोज रहा हूं! MySQL से आ रहा है जो कोई संख्या नहीं होने पर वर्चर्स को पूर्णांक में कास्टिंग करते समय त्रुटि नहीं देता है .... – gabn88

+0

यह उन प्रमुख रिक्त स्थानों के साथ सॉर्टिंग करता है जो 'TRIM' हल नहीं करेंगे। –

2

ज्यादा जवाब मुझे मदद की लेकिन काम नहीं किया है, तो में स्ट्रिंग डेटाबेस के साथ अतिरिक्त वर्णों के साथ शुरू हुआ।

निम्नलिखित मेरे लिए काम किया:

SELECT name 
FROM folders 
ORDER BY 
COALESCE(SUBSTRING(name FROM '^(\\d+)')::INTEGER, 99999999), 
SUBSTRING(name FROM '^\\d* *(.*?)(\\d+)?$'), 
COALESCE(SUBSTRING(name FROM ' (\\d+)$')::INTEGER, 0), 
name; 

तो यह एक:

  1. अर्क स्ट्रिंग में पहले नंबर, या 99999999.
  2. अर्क स्ट्रिंग है कि संभव पहले इस प्रकार का उपयोग करता है नंबर।
  3. पीछे संख्या निकालता है, या का उपयोग करता है 0.
0

टो के अंतिम एसक्यूएल मेरे लिए काम किया। हालांकि अगर आप इस कोड को php से कॉल कर रहे हैं तो आपको अतिरिक्त स्लैश जोड़ने की आवश्यकता है।

SELECT name 
FROM folders 
ORDER BY 
COALESCE(SUBSTRING(name FROM '^(\\\\d+)')::INTEGER, 99999999), 
SUBSTRING(name FROM '^\\\\d* *(.*?)(\\\\d+)?$'), 
COALESCE(SUBSTRING(name FROM ' (\\\\d+)$')::INTEGER, 0), 
name; 
2

इस सभी पद्धतियों का वर्णमाला के क्रम में मेरे चयन पर छाँटे:

test 1 
test 10 
test 2 
test 20 

यह समाधान मेरे लिए काम किया (lc_collate: 'ru_RU.UTF8'):

SELECT name 
FROM folders 
ORDER BY SUBSTRING(name FROM '([0-9]+)')::BIGINT ASC, name; 

test 1 
test 2 
test 10 
test 20 
0

एक VLK के जवाब उपरोक्त ने मुझे बहुत मदद की, लेकिन यह केवल संख्यात्मक भाग से वस्तुओं को क्रमबद्ध करता है, जो मेरे मामले में दूसरा आया था। मेरा डेटा था (डेस्क 1, डेस्क 2, डेस्क 3 ...) एक स्ट्रिंग हिस्सा, एक स्थान और एक संख्यात्मक हिस्सा। ए वील्क के जवाब में सिंटैक्स ने संख्या से क्रमबद्ध डेटा लौटाया, और उस पर उपर्युक्त का एकमात्र उत्तर था जिसने चाल बनाई थी। हालांकि जब स्ट्रिंग हिस्सा अलग था, (उदाहरण के लिए डेस्क 3, डेस्क 4, टेबल 1, डेस्क 5 ...) तालिका 1 पहले डेस्क 2 से प्राप्त होगा। मैंने इसे नीचे दिए गए वाक्यविन्यास का उपयोग करके तय किया है:

...order by SUBSTRING(name,'\\w+'), SUBSTRINGname FROM '([0-9]+)')::BIGINT ASC;