क्या निम्नलिखित क्रम 1,2,3,6,10,10A, 10B, 11 में निम्नलिखित तार को क्रमबद्ध करने के लिए कोई टकराव है?


12

मेरे पास VARCHAR कॉलम वाला एक डेटाबेस है जिसमें अलग-अलग लंबाई के पूर्णांक हैं। मैं उन्हें सॉर्ट करना चाहता हूं, इसलिए 10 9 के बाद आता है, 1 नहीं, और 70 ए 70 के बाद आता है। मैं ऐसा PATINDEX () , CTE और CASE स्टेटमेंट के साथ WHERE क्लॉज में कर पाया।

हालांकि, मैं सोच रहा था कि क्या कोई टकराव था जहां यह आवश्यक होगा।


यहाँ उस सुझाव के लिए नई कड़ी है जो अब Microsoft ने Connect से UserVoice पर स्थानांतरित कर दी है अभी तक URIs को अग्रेषित नहीं किया है: "प्राकृतिक छँटाई" / DIGITSASNUMBERS को एक Collation विकल्प के रूप में समर्थन करें
सोलोमन रुट्ज़की

2
Microsoft ने कहा है कि यदि वे पर्याप्त वोट प्राप्त करते हैं तो वे इसे SQL सर्वर में अंतर्निहित सुविधा के रूप में लागू करेंगे। इसलिए यहां पर जाएं और वोट बटन पर क्लिक करें
पीटर आइलेट

जवाबों:


8

कोड पृष्ठ, लहजे, मामले, चौड़ाई, काना के आधार पर, वर्णानुक्रम छँटाई के बारे में है। संख्या वर्ण (0-9) में कोई भी गुण नहीं है।

तो 9हमेशा किसी भी प्रकार के बाद 10Bहै ।

जैसा कि आपने नोट किया है कि आपको इसे अलग करना होगा या इस तरह छाँटना होगा:

ORDER BY
    RIGHT('                              ' + MyColumn, 30)

दाईं ओर की लंबाई निर्धारित करती है कि आपके पास कितने स्थान हैं।

आप निश्चित रूप से कर सकते हैं:

  • इस अनावश्यक (और बहुत जल्दी) बनाने के लिए 2 कॉलम हैं और उन्हें संयोजित करने के लिए एक कंप्यूटेड कॉलम है
  • अग्रणी शून्य पर जोर देते हैं
  • सही एक चार में उचित (ऊपर मेरे अधिकार का एक संग्रहीत संस्करण)

बाद के 2 सुझाव मेरे राइट के ऊपर और थोड़े अलग हैं। सॉर्ट करने के लिए तेज (कोलुकम की कोई प्रसंस्करण की आवश्यकता नहीं) लेकिन अधिक भंडारण की आवश्यकता है


मैं नहीं देखता कि यह कैसे काम करता है। यह 2, 2 ए, 3, आदि के लिए टूट जाता है ...
म्लाडेन प्राजेडिक

@ म्लादेन प्राजिडिक: आप सही हैं, उफ़। अनुगामी वर्णमाला के बारे में भूल गए
gban

के बारे में " तो 9हमेशा 10Bकिसी भी प्रकार के बाद होता है । ": यह एसक्यूएल सर्वर में केवल एक ही तरीका है क्योंकि "डिजिट्सन्यूअर्स" को संभालने के लिए अंतर्निहित सॉर्ट विकल्प को कोलिशन विकल्प के रूप में उजागर नहीं किया गया है। फिर भी ;-) यह विंडोज 7 में शुरू होने वाले विंडोज-आधारित एप्स के लिए उपलब्ध हो गया, जो कि फाइल एक्सप्लोरर में सबसे खास है। और यह एक दिन SQL सर्वर के संपर्क में हो सकता है, यदि पर्याप्त लोग विचार का समर्थन करते हैं। मैंने निम्नलिखित कनेक्ट का सुझाव देकर गेंद को लुढ़काने की कोशिश की: सहयोग "प्राकृतिक छँटाई" / एक संयोजन विकल्प के रूप में DIGITSASNUMBERS
सोलोमन रटज़की

8

मैं एक संगणित कॉलम सेटअप करूंगा, उसके आधार पर क्रमबद्ध। कुछ इस तरह

CAST( 
     CASE WHEN IS_NUMERIC(left(OtherColumn, 2) = 1) then 
         left(OtherColumn,2) 
     else 
         left(otherColumn, 1)  
AS INT)

फिर इस कॉलम को सॉर्ट करने के लिए उपयोग करें क्योंकि अब आप कॉलम को इंडेक्स कर सकते हैं।


इसी तरह की समस्याओं के बारे में जानना वास्तव में उपयोगी है। हालाँकि, इस मामले में मैं स्कीमा नहीं बदल सकता।
जस्टिन डियरिंग

क्या आप स्कीमा में जोड़ सकते हैं? एक संगणित कॉलम को छोड़कर, आप हमेशा एक दृश्य बना सकते हैं - यद्यपि यह वास्तव में अनुकूलन योग्य नहीं होगा जैसे कि एक संगणित स्तंभ हो सकता है।
हारून बर्ट्रेंड

यदि आप अनुक्रमित दृश्य करते हैं, और एंटरप्राइज़ संस्करण है, तो आपकी क्वेरी अनुक्रमित दृश्य का उपयोग स्वचालित रूप से करेगी यदि यह पता लगा सकती है कि आप क्या करने की कोशिश कर रहे हैं। यदि मानक संस्करण का उपयोग करने के लिए अनुक्रमित दृश्य को ट्रिगर करने के लिए आपको (NOEXPAND) का उपयोग करने की आवश्यकता होगी। उस बिंदु पर आपको अपने आदेश में केस स्टेटमेंट रखना होगा, लेकिन यह काम करना चाहिए, मुझे लगता है।
मर्डेनी

आपको एक संगणित कॉलम बनाने की आवश्यकता नहीं है। आप उस अभिव्यक्ति का उपयोग सीधे ORDER BY क्लॉज़ में कर सकते हैं
a_horse_with_no_name

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

5

यदि आप यह साबित करने के लिए एक दर्दनाक तरीका चाहते हैं कि @gb क्या कह रहा है (अनिवार्य रूप से आप सब्सट्रेट को ऑर्डर करने के लिए अलग-अलग तरीके से नहीं बता सकते हैं), तो आप एक त्वरित #temp तालिका बना सकते हैं जिसमें आपके द्वारा अपेक्षित ऑर्डर के लिए गुणांक है, और देखें कि क्या किसी भी टकराव से ऑर्डर करने पर समान ऑर्डर मिलता है:

CREATE TABLE #foo(id INT, n NVARCHAR(10));

CREATE TABLE #bar(collation SYSNAME);

SET NOCOUNT ON;

INSERT #foo SELECT 1,'1'
UNION SELECT 2,'2'
UNION SELECT 3,'3'
UNION SELECT 4,'6'
UNION SELECT 5,'10'
UNION SELECT 6,'10A'
UNION SELECT 7,'10B'
UNION SELECT 8,'11';

DECLARE @sql NVARCHAR(MAX) = N'';

SELECT @sql += N'
    WITH x AS 
    (
        SELECT n, rn = ROW_NUMBER() OVER 
        (ORDER BY n COLLATE ' + name + ') FROM #foo
    ) 
    INSERT #bar 
    SELECT TOP (1) ''' + name + ''' FROM x
    WHERE NOT EXISTS
    (
        SELECT COUNT(*) FROM #foo AS f
        WHERE f.id = x.rn
        AND f.n <> x.n
    );' FROM sys.fn_helpcollations();

EXEC sp_executesql @sql;

SELECT collation FROM #bar;

GO
DROP TABLE #foo, #bar;

यह लगभग 10 सेकंड में मेरे लिए चलता है और 0 पंक्तियों की पैदावार करता है - जिसका अर्थ है कि SQL सर्वर (कम से कम 2008 R2, कोशिश नहीं की गई Denali) के लिए कोई कोलाज उपलब्ध नहीं है। आपको छंटाई को परिभाषित करने के लिए एक अलग तरीके की आवश्यकता है।


2

वास्तविक संख्या के रूप में तार में संख्याओं को छांटने का एक समझदार, कुशल साधन चाहते हैं? मेरे Microsoft कनेक्ट सुझाव के लिए मतदान करने पर विचार करें: "प्राकृतिक सॉर्टिंग" / DIGITSASNUMBERS को एक Collation विकल्प के रूप में समर्थन करें


हालांकि यह प्रश्न SQL सर्वर के लिए विशिष्ट है, और यह उत्तर नहीं है, मैंने महसूस किया कि मुझे अभी भी इस जानकारी को पोस्ट करना चाहिए ताकि इसके बारे में जागरूकता बढ़ाई जा सके और किसी अन्य उत्तर के विरोध में न हो।

कहा जा रहा है, SQL सर्वर के बाहर, कुछ वातावरणों में इस प्रकार की छंटाई करना संभव है। यह ऐसा कुछ है जो कम से कम यूनिकोड प्रलेखन में निर्दिष्ट है। में यूनिकोड LOCALE डेटा मार्कअप लैंग्वेज (LDML) भाग 5: COLLATION मानक / रिपोर्ट, वहाँ के लिए एक चार्ट है मिलान सेटिंग कि छँटाई व्यवहार सिलाई के लिए विभिन्न विकल्प वर्णन करता है। विकल्पों में से एक है -kn-trueया [numericOrdering on]:

यदि सेट किया जाता है , तो दशमलव अंकों (General_Category = Nd [[ UAX44 ]) में किसी भी क्रम को प्राथमिक स्तर पर उसके संख्यात्मक मान के साथ क्रमबद्ध किया जाता है। उदाहरण के लिए, "A-21" <"A-123"। गणना की प्राथमिक वजन के शुरू में सभी कर रहे हैं अंकों पुनर्व्यवस्था समूह। इस प्रकार एक अनकहा यूसीए टेबल के साथ, "एक $" <"a0" <"a2" <"a12" <"a" "<" aa "।

हालांकि, यह दस्तावेज़ एक "तकनीकी मानक" है और कोर यूनिकोड विनिर्देशन का हिस्सा नहीं है। दस्तावेज़ के शीर्ष पर एक नोट बताता है:

एक यूनिकोड तकनीकी मानक (यूटीएस) एक स्वतंत्र विनिर्देश है। यूनिकोड मानक के अनुरूप किसी भी यूटीएस के अनुरूप नहीं है।

इसलिए, यह विशेष व्यवहार SQL सर्वर या .NET में भी उपलब्ध नहीं है (कम से कम मूल रूप से नहीं), भले ही दोनों कोर यूनिकोड विनिर्देश के अनुरूप हों।

आईसीयू परियोजना (यूनिकोड के लिए अंतर्राष्ट्रीय अवयव) है कि लागू इस कार्यक्षमता, और वहाँ है यहां तक कि इसके बारे में एक ऑनलाइन डेमो C / C ++ और जावा पुस्तकालयों का एक सेट है। और "संबंधित प्रोजेक्ट्स" के तहत एक .NET प्रोजेक्ट का एक लिंक है जो ICU लाइब्रेरी के लिए COM ऑब्जेक्ट रैपर लगता है जो इस कार्यक्षमता को प्रबंधित कोड के संपर्क में लाने की अनुमति देगा। लेकिन यह स्पष्ट नहीं है कि .NET प्रोजेक्ट अभी भी सक्रिय है।

लेकिन इस व्यवहार को कार्रवाई में देखने के लिए, ICU Collation Demo पर जाएं

बाईं ओर इनपुट पाठ क्षेत्र में निम्नलिखित चिपकाएँ :

1
2
10B
6
11
10A
3
10

सभी विकल्पों को "डिफ़ॉल्ट" पर सेट करें। sortबटन के दाईं ओर "इनपुट लाइन नंबर" विकल्प की जाँच करें, और सुनिश्चित करें कि "अलग ताकत" विकल्प संयुक्त राष्ट्र की जाँच है।

sortबटन पर क्लिक करें और आपको निम्नलिखित प्राप्त करना चाहिए:

[1] 1
[8] 10
[6] 10A
[3] 10B
[5] 11
[2] 2
[7] 3
[4] 6

यह तब होना चाहिए जब एक विशिष्ट स्ट्रिंग सॉर्ट करते समय, और आप SQL सर्वर में क्या देख रहे हैं।

अब, बटन के ठीक ऊपर रेडियो बटन की श्रृंखला में sort, दूसरी पंक्ति को "संख्यात्मक" लेबल किया जाता है। "ऑन" रेडियो बटन का चयन करें।

sortबटन पर फिर से क्लिक करें और आपको निम्नलिखित वापस चाहिए:

[1] 1
[2] 2
[7] 3
[4] 6
[8] 10
[6] 10A
[3] 10B
[5] 11

यह सवाल करना कि क्या सांख्यिक भाग स्ट्रिंग के मध्य में होता है तो यह काम करता है? ठीक है, बाईं ओर इनपुट पाठ क्षेत्र में निम्नलिखित पेस्ट करें (पिछली सूची की जगह):

Script - 1.sql
Script - 2.sql
Script - 10B.sql
Script - 6.sql
Script - 11.sql
Script - 10A.sql
Script - 3.sql
Script - 10.sql

सुनिश्चित करें कि संख्यात्मक सेटिंग अभी भी "चालू" पर सेट है। sortबटन पर फिर से क्लिक करें और आपको निम्नलिखित वापस चाहिए:

[1] Script - 1.sql
[2] Script - 2.sql
[7] Script - 3.sql
[4] Script - 6.sql
[8] Script - 10.sql
[6] Script - 10A.sql
[3] Script - 10B.sql
[5] Script - 11.sql

इसे दूसरी जगह देखना चाहते हैं? अपने हार्डड्राइव पर एक फ़ोल्डर बनाएँ, कुछ जैसे C: \ temp \ sorting \ , और उन्हीं "Script -..." नामों की खाली फाइलें बनाएँ। एक है DIRएक कमांड विंडो में और आप मानक छंटाई देखेंगे। लेकिन जब आप विंडोज एक्सप्लोरर में फ़ाइलों की सूची देख रहे हैं, तो आपको "संख्यात्मक" विकल्प :-) का उपयोग करके छंटनी हुई सूची दिखाई देगी।


FYI करें, ICU कोलाजेशन के लिए 10 लाभ का समर्थन करता है। इस ब्लॉग पोस्ट को पीटर आइसेनट्राट द्वारा देखें ।
बेसिल बॉर्क

@BasilBourque कि PG10 के बारे में उल्लेख करने के लिए धन्यवाद। उस ब्लॉग पोस्ट में, अंत में कहा गया है कि "ICU इस क्षेत्र में बहुत अधिक कार्यक्षमता प्रदान करता है जिसे हम अभी तक PostgreSQL के माध्यम से उजागर नहीं कर रहे हैं। केस-असंवेदनशील छंटाई, उच्चारण-असंवेदनशील छँटाई और पूरी तरह से एक टकराव को अनुकूलित करने के विकल्प हैं। भविष्य में PostgreSQL के उन लोगों के लिए रिलीज़। " इसलिए इसके पहले / वर्तमान कार्यान्वयन में, यह मेरे जवाब में किसी भी जानकारी को नहीं बदलता है। यदि कोई भविष्य की पेशकश संख्यात्मक छँटाई के लिए अनुमति देता है, तो मैं अपने उत्तर में इसका उल्लेख करूंगा, लेकिन एक फुटनोट के रूप में क्योंकि यह प्रश्न SQL सर्वर-विशिष्ट है।
सोलोमन रटज़की
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.