2016-09-12 47 views
5

'da Alfanümerik Sıralama, bunu nasıl düzenleyeceğimi bana yardım edebilir mi?
Sıralamak istediğim dinamik bir desen desenim var, alfasayısal değer ve harfler içeriyor.Sql Server 2008

CREATE TABLE dbo.Pattern (Pattern varchar(50) NULL) 
INSERT INTO dbo.Pattern (Pattern) VALUES ('A11') 
INSERT INTO dbo.Pattern (Pattern) VALUES ('A12') 
INSERT INTO dbo.Pattern (Pattern) VALUES ('A8') 
INSERT INTO dbo.Pattern (Pattern) VALUES ('A2') 
INSERT INTO dbo.Pattern (Pattern) VALUES ('B6') 
INSERT INTO dbo.Pattern (Pattern) VALUES ('B21') 
INSERT INTO dbo.Pattern (Pattern) VALUES ('B10') 
INSERT INTO dbo.Pattern (Pattern) VALUES ('B3') 
INSERT INTO dbo.Pattern (Pattern) VALUES ('B100') 
INSERT INTO dbo.Pattern (Pattern) VALUES ('B2') 
INSERT INTO dbo.Pattern (Pattern) VALUES ('AA') 
INSERT INTO dbo.Pattern (Pattern) VALUES ('BA') 
INSERT INTO dbo.Pattern (Pattern) VALUES ('A20') 
INSERT INTO dbo.Pattern (Pattern) VALUES ('AB') 
INSERT INTO dbo.Pattern (Pattern) VALUES ('BB') 

SELECT Pattern FROM dbo.Pattern ORDER BY Pattern 

DROP Table dbo.Pattern 

sonuç böyle gösteriyor:

A11 
A12 
A2 
A20 
A8 
AA 
AB 
B10 
B100 
B2 
B21 
B3 
B6 
BA 
BB 

Ama göstermek istiyorum Tüm bu sonuçla gibidir: sizin örnek veriler için

AA 
A1 
A2 
A8 
A11 
A12 
A20 
AB 
BA 
B2 
B3 
B6 
B10 
B21 
B100 
BB 
+2

artı 1 örnek veriler için – TheGameiswar

+0

İstediğiniz sonucun arkasındaki mantığı tanımlar mısınız? Neden B100'den sonra 'AA' geliyor? Hangisi AAA ve BA1 arasında gelir? Niye ya? Mantığı tanımlayabilseydiniz, bahse girerim kendi sorunuza kolayca cevap verebilirsiniz. –

+0

@TabAlleman, Desen düzeni için çıkması gereken sonucun içeriğini zaten düzenliyorum. – itsMacyAnn

cevap

1
SELECT Pattern 
FROM dbo.Pattern 
ORDER BY LEFT(Pattern,1), 
     CASE WHEN SUBSTRING(Pattern,2,LEN(Pattern)) LIKE '%[0-9]%' THEN CAST(SUBSTRING(Pattern,2,LEN(Pattern)) as int) 
      WHEN SUBSTRING(Pattern,2,LEN(Pattern)) = 'A' THEN 0 
      ELSE 10000000 END, 
      SUBSTRING(Pattern,2,LEN(Pattern)) 

Will çıkışı:

Pattern 
AA 
A2 
A8 
A11 
A12 
A20 
AB 
BA 
B2 
B3 
B6 
B10 
B21 
B100 
BB 
1

, bu yakın gelir:

order by left(pattern, patindex('%[0-9]%', pattern)), 
     patindex('%[0-9]%', pattern), 
     len(pattern) asc, 
     pattern 

Ama sen hepsini istiyorsun Alfalar sonuncu olması, bu nedenle ihtiyaç duyulan bir case (Bence):

order by left(pattern, patindex('%[0-9]%', pattern)), 
     (case when pattern like '%[0-9]%' 
       then patindex('%[0-9]%', pattern) 
       else 999 
      end), 
     len(pattern) asc, 
     pattern 
+0

Yukarıda belirtildiği gibi çıktı döndürmüyor. niye ya ? – Susang

+0

Bu mantık, “B1” in “A10” dan önce geleceği anlamına gelir çünkü daha kısa bir boyu vardır. –

+0

@Suraz. . . Cevabınız zaten var, ama yine de bu cevabı düzelttim. –

1
SELECT Pattern 
FROM dbo.Pattern 
ORDER BY CASE WHEN PATINDEX('%[0-9]%', Pattern) > 0 
       THEN LEFT(Pattern, PATINDEX('%[0-9]%', Pattern)-1) 
       ELSE Pattern 
     END, 
     CASE WHEN PATINDEX('%[0-9]%', Pattern) > 0 
       THEN CONVERT(INT, SUBSTRING(Pattern, PATINDEX('%[0-9]%', Pattern), LEN(Pattern))) 
       ELSE 0 
     END 

göndermeden önce net arama ve yığın taşması edin.

Referans:http://www.essentialsql.com/use-sql-server-to-sort-alphanumeric-values/

+0

"Geçersiz uzunluk parametresi SOL veya SUBSTRING işlevine iletildi." Hatasını döndürür. "AA", "BA" değerleri için hata atınız, çünkü sayısal değerleri yoktur, bu yüzden "SOL ('AA', 0 - 1) 'hatası atınız. – Arulkumar

+0

Msg 537, Düzey 16, Durum 2, Satır 1 Geçersiz uzunluk parametresi SOL veya SUBSTRING işlevine iletildi. – itsMacyAnn

+0

@ayakamacy Sadece harf içeren kalıpları işlemek için bir "CASE" ifadesi kullanmak için cevabımı güncelledim. –

0
ben alfa ve num parçaları separater olur

:

ORDER BY 
    CASE WHEN PATINDEX('%[0-9]%', Pattern)=0 THEN 1 ELSE 0 END,--Put no-nums last 
    CASE WHEN PATINDEX('%[0-9]%', Pattern) != 0 THEN LEFT(Pattern, PATINDEX('%[0-9]%', Pattern)-1) ELSE Pattern END, 
    CASE WHEN PATINDEX('%[0-9]%', Pattern) != 0 THEN SUBSTRING(Pattern, PATINDEX('%[0-9]%', Pattern), LEN(Pattern)) END 
0

Kullanım çapraz içinde satır hesaplamaları kolaylaştırmak için geçerli

select pattern 
from pattern 
cross apply (
    select leftLen = isnull(nullif(patindex('%[0-9]%', pattern),0) - 1, len(pattern)) 
      ,totalLen = len(pattern) 
    ) c 
order by 
case leftLen when totalLen then 2 else 1 end, 
left(Pattern, leftLen), 
cast(right(Pattern, totalLen-leftLen) as int)