SQL

2012-03-26 4 views
8

में [0-Z] के बजाय [0-Z] के साथ वर्चर द्वारा ऑर्डर करें डिफ़ॉल्ट रूप से, अक्षर वर्णों से पहले SQL ऑर्डर संख्याएं।SQL

तो अगर मैं स्तंभ "नाम" है: 0-जेड (पहले 0 करने के लिए 9, तो AZ), क्वेरी

SELECT * FROM ... ORDER BY name 

में परिणाम होगा द्वारा

abc 
ab1 
a1b 
1ba 
1bac 
b21 

के बाद से एसक्यूएल प्रकार :

1ba 
1bac 
a1b 
ab1 
abc 
abc1 
b21 

लेकिन मैं इसे ए -0 (पहले एजेड, फिर 0-9) द्वारा सॉर्ट करना चाहता हूं।

abc 
abc1 
ab1 
a1b 
b21 
1ba 
1bac 

मैं इसे एक प्रश्न में कैसे कर सकता हूं? अधिक विशेष रूप से, मैं SQLite में यह कैसे कर सकता हूं?

मुझे Sort MySQL results alphabetically, but with numbers last में एक समाधान मिला, लेकिन केवल पहले चार के लिए।

+0

क्या आपके मूल्य हमेशा 3 वर्ण लंबे होते हैं? – gbn

+0

आप [फ़ंक्शन बनाने के लिए सी इंटरफ़ेस का उपयोग कर सकते हैं] (http://www.sqlite.org/c3ref/create_function.html) जो ['regexp'] का उपयोग करता है (http://sqlite.org/lang_expr.html) ऑपरेटर अलग-अलग कॉलम में अक्षरों और संख्याओं को यंक करने के लिए। –

+0

@ जीबीएन नहीं, वे बहुत लंबाई में हो सकते हैं .. शायद यह दिखाया जाना चाहिए :) – Nic

उत्तर

0

यह मेरा विचार है:

select *, case 
      when substring(name,1,1) like '[0-9]' then 1 
      else 0 
      end as help_order 
from (
select 'ab1' as name union select 'a1b' as name union select '1ba' as name union select 'b21' as name 
) a 
order by help_order, name 
: आप नाम से इसी कॉलम के आधार एक और "help_column" कि जाँच करता है जोड़ने अगर पहले चार एक संख्या है और यह करने के लिए 1 असाइन करें, अन्यथा 0 आवंटित और फिर और फिर

बेशक, यदि आवश्यक हो तो आपको एक से अधिक संख्याओं का इलाज करने के लिए नियमित अभिव्यक्ति [0-9] में सुधार करना पड़ सकता है।

और, ज़ाहिर है, आपको आंतरिक क्वेरी (अपनी तालिका के साथ कई यूनियनों के साथ) को प्रतिस्थापित करना चाहिए।

+0

यह केवल पहले चरित्र के लिए काम करेगा (मैंने अपनी पहली कोशिश में एक ही गलती की है) –

1

इन आंकड़ों के साथ टेस्ट

declare @t table(a char(3)) 
insert @t values('ab1') 
insert @t values('a1b') 
insert @t values('1ba') 
insert @t values('b21') 
insert @t values('12a') 
insert @t values('13b') 


select a, 
patindex('[0-9]%', a + 'a'), 
patindex('_[0-9]%', a + 'a'), 
patindex('__[0-9]%', a + 'a') 
from @t order by 2, 3, 4, 1 

या

कृपया
select a 
from 
(select a, 
patindex('[0-9]%', a + 'a') b, 
patindex('_[0-9]%', a + 'a') c, 
patindex('__[0-9]%', a + 'a') d 
from @t) e 
order by b, c, d, a 
+4

मुझे विश्वास नहीं है कि यह वैध SQLite है वाक्य - विन्यास। –

3

मैं SELECT अन्य स्तंभ ing सुझाव है, name_replace कहते हैं, अंक एक उच्च ASCII वर्ण द्वारा प्रतिस्थापित के साथ (जैसे ~) , उसके बाद उस कॉलम पर नाम पर क्रमबद्ध करें। दुर्भाग्य से SQLite regular expression के लिए समर्थन की जगह नहीं है:

SELECT name, replace(... replace(replace(name, '0', '~'), '1', '~') ... '9', '~') AS name_replace 
    FROM mytable 
ORDER BY name_replace, name 

अंक पिछले आ जाएगा जब name_replace पर छँटाई। name पर सॉर्टिंग तब अंकों द्वारा क्रमबद्ध किया जाएगा।

0

थासी एएससीआईआई 122 (जो कम मामला जेड है) से ऊपर 0-9 विकल्प देता है।

SQLLite चरित्र कोड द्वारा प्रतिस्थापन करने के लिए एक CHAR समारोह नहीं है (उदाहरण के लिए CHAR(123)CHAR(132) करने के लिए) जो मेरे CHAR के बजाय जरूरत हो सकती है (123) प्रयास

निश्चित रूप से untested है :-)

ORDER BY 
    REPLACE 
    REPLACE(
    REPLACE(
    REPLACE(
    REPLACE(
    REPLACE(
    REPLACE(
    REPLACE(
    REPLACE(
    REPLACE(name, '0', '{0') 
    , '1', '{2') 
    , '2', '{2') 
    , '3', '{3') 
    , '4', '{4') 
    , '5', '{5') 
    , '6', '{6') 
    , '7', '{7') 
    , '8', '{8') 
    , '9', '{9') 

संपादित करें: हालांकि, @ दाऊद फैबर का समाधान एक ही लेकिन कुछ हद तक सरल ... करता

2

यह उपलब्ध कराए गए आंकड़ों के साथ काम कर देता है।

SELECT * 
FROM Table 
ORDER BY Name COLLATE SQL_EBCDIC037_CP1_CS_AS 

हालांकि आप यह सुनिश्चित करने के लिए विभिन्न कॉलेशन प्रकारों को देखना चाह सकते हैं कि आप बोर्ड में जो चाहते हैं वह कर लें।

अपडेट: आपने SQLite का उल्लेख किया हालांकि मैंने इसे एमएसएसक्यूएल पर परीक्षण किया। सुनिश्चित नहीं है कि यह संयोजन SQLite में उपलब्ध है लेकिन नीचे दी गई टिप्पणियों में उपयोगी जानकारी हो सकती है।

+1

ओपी ने वास्तव में SQLite का उल्लेख किया है, लेकिन यह काम कर सकता है - मुझे नहीं पता कि SQLite में कोई मौजूदा संयोजन अनुक्रम है या नहीं, हालांकि चाल - एक बनाना होगा। –

+0

@DavidFaber के रूप में इंगित किया गया, वास्तविक लक्ष्य प्लेटफ़ॉर्म SQLite है। मुझे http://sqlite.org/datatype3.html मिला लेकिन मैं वास्तव में समझ नहीं पा रहा हूं कि यह समाधान SQLite में करने योग्य है या नहीं। – Nic

+0

मैंने तदनुसार अपना जवाब अपडेट किया है, धन्यवाद –