2016-06-12 11 views
1

I BY-Daten in der folgenden Reihenfolge bestellen möchten:ORDER BY Alphanumeric Art

  • Nummer-Nummer
  • Alpha-Nummer
  • Alpha ohne Bindestrich

Ich habe folgendes sort:

  • 120-1
  • 120-2
  • 120-10
  • Digitale-1
  • Digitale-10
  • Digitale-2
  • Hochzeit

Dies ist die Reihenfolge, die ich suche, außer Die Digitaleinträge (Alpha mit Bindestrich) sind nicht nach dem Bindestrich nach Zahlen sortiert.

Nach vielen Versuchen, hier ist meine aktuelle SQL-Anweisung:

SELECT SessionID, Identifier FROM Session 
ORDER BY 
CASE 
    WHEN CAST(Identifier AS INTEGER) THEN SUBSTR(Identifier,0, INSTR(Identifier, '-')) + CAST(SUBSTR(Identifier, INSTR(Identifier, '-')+1, 999) AS INTEGER) 
ELSE Identifier END 

Was mache ich falsch?

Danke.

+0

Und welche Ausgabe erhalten Sie anstelle der erwarteten Reihenfolge? – Murphy

+0

Die Liste unter 'Ich habe die folgende Art:'. Alles funktioniert außer der Digital (Alpha mit Strich) ist nicht nach Nummer aufgelistet. – rkamarowski

+0

können Sie regexp verwenden? –

Antwort

2

1) Sortieren nach Strings - in ihnen haben, so dass sie zuerst

2) Sortieren nach dem ersten Teil vor - in den Zeichenketten enthalten - sie als ganze Zahlen Gießen, wo anwendbar, Else, um durch die Säule selbst

erscheinen

3) Sortieren nach dem zweiten Teil nach - in den Zeichenketten enthalten - sie als ganze Zahlen Gießen, wo anwendbar, Else, um durch die Säule selbst

select val 
from t 
order by 
case when val like '%-%' then 1 else 2 end 
,case when substr(val,1,instr(val,'-')-1) glob '*[0-9]*' 
     then cast(substr(val,1,instr(val,'-')-1) as integer) 
     when substr(val,1,instr(val,'-')-1) glob '*[a-zA-Z]*' 
     then substr(val,1,instr(val,'-')-1) 
else val end 
,case when val like '%-%' then cast(substr(val,instr(val,'-')+1) as integer) 
else val end 

SQL Fiddle

+0

Perfekt! Vielen Dank. – rkamarowski

0

Ihre Logik ist die Rekonstruktion irgendwie die Saiten, sondern auch für die order by, wollen Sie etwas wie folgt aus:

order by (case when CAST(Identifier AS INTEGER) <> 0 then 1 
       when Identifier like '%-%' then 2 
       else 3 
      end), 
     identifier 

Hinweis: Dies setzt voraus, dass die Zahlen sind nie 0.

+0

Gordon, das mir gibt: 120-1 120-2 120-10 Hochzeit Digitale-1 Digitale-10 Digitale-2 Das alles alpha (Wedding) ist nicht am Boden, und die Digital ist immer noch nicht nach Nummer sortiert. – rkamarowski

+0

Gordon, das gibt mir: – rkamarowski