Sqlserver
 sql >> डेटाबेस >  >> RDS >> Sqlserver

एसक्यूएल:मिश्रित अक्षरों और संख्याओं के विकल्प के आधार पर आदेश

मैं इसे एक नए उत्तर के रूप में रखता हूं, क्योंकि यह वास्तव में एक उत्तर नहीं है बल्कि विभिन्न दृष्टिकोणों की तुलना है:

निष्कर्ष:

  • XML को छोड़कर सभी दृष्टिकोण काफी रैखिक पैमाने पर हैं
  • XML छोटी पंक्तियों की संख्या के साथ सबसे तेज़ है लेकिन उच्च पंक्ति संख्या के साथ बदतर हो जाती है

एक परीक्षण परिदृश्य बनाएं

CREATE TABLE #tbl (ID INT IDENTITY,sortColumn VARCHAR(100));
INSERT INTO #tbl VALUES
 ('A-1')
,('A-10')
,('A-2')
,('A-3')
,('A-4')
,('A-5')
,('A-6')
,('A-7')
,('A-8')
,('A-9')
,('A-3a')
,('A-3b')
,('A-3c')
,('B-1')
,('B-10')
,('B-11')
,('B-12')
,('B-12a')
,('B-12b')
,('B-13')
,('B-2')
,('B-3')
,('B-4')
,('B-5')
,('B-6')
,('B-7')
,('B-8')
,('A-8a')
,('B-8')
,('B-9'); --30 rows
GO 1000  -- x 1.000 = 30.000 rows

मैट का दृष्टिकोण (आवश्यक के अनुसार साफ किया गया)

  • 3 मील पंक्तियों पर 46 सेकंड
  • 300,000 पंक्तियों पर 4.5 सेकंड
  • 30,000 पंक्तियों पर 1.3 सेकंड
  • 3.000 पंक्तियों पर 0.7 सेकंड

कोड

SELECT ID,sortColumn
FROM
    #tbl
ORDER BY
LEFT(sortColumn,CHARINDEX('-',sortColumn) -1)
,CAST((CASE
    WHEN ISNUMERIC(SUBSTRING(sortColumn,CHARINDEX('-',sortColumn) + 1,3)) = 1 THEN SUBSTRING(sortColumn,CHARINDEX('-',sortColumn) + 1,3)
    WHEN ISNUMERIC(SUBSTRING(sortColumn,CHARINDEX('-',sortColumn) + 1,2)) = 1 THEN SUBSTRING(sortColumn,CHARINDEX('-',sortColumn) + 1,2)
    WHEN ISNUMERIC(SUBSTRING(sortColumn,CHARINDEX('-',sortColumn) + 1,1)) = 1 THEN SUBSTRING(sortColumn,CHARINDEX('-',sortColumn) + 1,1)
    ELSE NULL
END) AS INT)
,RIGHT(sortColumn,
    LEN(sortColumn) - 
    LEN(LEFT(sortColumn,CHARINDEX('-',sortColumn) -1)) 
    - LEN(CASE
            WHEN ISNUMERIC(SUBSTRING(sortColumn,CHARINDEX('-',sortColumn) + 1,3)) = 1 THEN SUBSTRING(sortColumn,CHARINDEX('-',sortColumn) + 1,3)
            WHEN ISNUMERIC(SUBSTRING(sortColumn,CHARINDEX('-',sortColumn) + 1,2)) = 1 THEN SUBSTRING(sortColumn,CHARINDEX('-',sortColumn) + 1,2)
            WHEN ISNUMERIC(SUBSTRING(sortColumn,CHARINDEX('-',sortColumn) + 1,1)) = 1 THEN SUBSTRING(sortColumn,CHARINDEX('-',sortColumn) + 1,1)
            ELSE NULL
    END)
    - 1 --the '-'
),ID;

CROSS APPLY में चरणबद्ध गणना s, परिकलित स्तंभों पर क्रमित करना

  • 3 मील पंक्तियों पर 44 सेकंड
  • 300,000 पंक्तियों पर 4.4 सेकंड
  • 30,000 पंक्तियों पर 0.9 सेकंड
  • 3.000 पंक्तियों पर 0.3 सेकंड

कोड

SELECT ID,sortColumn
FROM #tbl
CROSS APPLY(SELECT CHARINDEX('-',sortColumn) AS posMinus) AS pos
CROSS APPLY(SELECT SUBSTRING(sortColumn,1,posMinus-1) AS part1
                  ,SUBSTRING(sortColumn,posMinus+1,1000) AS part2
            ) AS parts
CROSS APPLY(SELECT ISNUMERIC(part2) AS p2isnum) AS checknum
CROSS APPLY(SELECT CASE WHEN p2isnum=1 THEN '' ELSE RIGHT(part2,1) END AS part3
                  ,CASE WHEN p2isnum=1 THEN part2 ELSE SUBSTRING(part2,1,LEN(part2)-1) END AS part2New
           ) AS partsNew
ORDER BY part1,part2new,part3,ID;

CROSS APPLY में चरणबद्ध गणना s, संयोजित गद्देदार स्ट्रिंग पर छँटाई

  • 3 मील पंक्तियों पर 42 सेकंड
  • 300,000 पंक्तियों पर 4.2 सेकंड
  • 30,000 पंक्तियों पर 0.7 सेकंड
  • 3.000 पंक्तियों पर 0.4 सेकंड

कोड

SELECT ID,sortColumn
FROM #tbl
CROSS APPLY(SELECT CHARINDEX('-',sortColumn) AS posMinus) AS pos
CROSS APPLY(SELECT SUBSTRING(sortColumn,1,posMinus-1) AS part1
                  ,SUBSTRING(sortColumn,posMinus+1,1000) AS part2
            ) AS parts
ORDER BY RIGHT('.....' + part1,5) + RIGHT('.....' + part2,5 - ISNUMERIC(RIGHT(part2,1)))
        ,ID;

XML के साथ विभाजन, संयोजित गद्देदार स्ट्रिंग पर छँटाई करना

  • 3 मील पंक्तियों पर 67 सेकंड
  • 300,000 पंक्तियों पर 6.2 सेकंड
  • 30,000 पंक्तियों पर 0.7 सेकंड
  • 3.000 पंक्तियों पर 0.3 सेकंड

कोड

SELECT ID,sortColumn
FROM
(
    SELECT CAST('<r>' + REPLACE(sortColumn,'-','</r><r>') + '</r>' AS XML) AS SortColumnSplitted
          ,*
    FROM #tbl
) AS tbl
ORDER BY RIGHT('.....' + SortColumnSplitted.value('r[1]','varchar(max)'),5) + RIGHT('.....' + SortColumnSplitted.value('r[2]','varchar(max)'),5 - ISNUMERIC(RIGHT(SortColumnSplitted.value('r[2]','varchar(max)'),1)))
        ,ID;


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. विंडोज़ 2012 पर सिस्टम डीएसएन के माध्यम से ओडीबीसी कनेक्शन का उपयोग करके SQL सर्वर 2008 से कनेक्ट करने में असमर्थ

  2. एसक्यूएल प्रतिस्थापन समारोह के अंदर रेगेक्स पैटर्न?

  3. SQL सर्वर:चर के माध्यम से वर्तमान डेटाबेस बदलें

  4. newid () sql सर्वर फ़ंक्शन के अंदर

  5. SQL सर्वर में सभी लॉजिकल ऑपरेटर का उपयोग कैसे करें - SQL सर्वर / TSQL ट्यूटोरियल भाग 126