2009-08-07 6 views
0

Ich arbeite mit einer Tabelle, die von einer externen Quelle kommt, und kann nicht "gereinigt" werden. Es gibt eine Spalte, die ein nvarchar (20) enthält und eine Ganzzahl von ungefähr 95% der Zeit enthält, aber gelegentlich ein Alpha enthält. Ich möchte etwas verwenden, wieSQL Server: sortiere eine Spalte wenn möglich numerisch, sonst alpha

select * from sch.tbl order by cast(shouldBeANumber as integer) 

aber dies wirft einen Fehler auf der ungeraden „3A“ oder „D“ oder „abgelöst“ -Wert.

Gibt es eine Möglichkeit zu sagen "Sortiere es wie eine Nummer, wenn du kannst, ansonsten einfach nach String sortieren"? Ich weiß, dass diese Aussage etwas schlampig ist, aber das ist im Grunde das, was ich will.

Hier können zum Beispiel sagen, dass die Werte waren

7,1,5A,SUPERCEDED,2,5,SECTION 

ich glücklich sein würde, wenn diese in einem der folgenden Arten sortiert wurden

1,2,5,7,5A,SECTION,SUPERCEDED 
1,2,5,5A,7,SECTION,SUPERCEDED 
SECTION,SUPERCEDED,1,2,5,5A,7 
5A,SECTION,SUPERCEDED,1,2,5,7 
(weil ich wirklich nur mit den numerischen diejenigen arbeiten müssen)
+0

wow, das war q iuick! Danke an alle – jlarson

Antwort

6

Ich brauche wirklich nur mit den numerischen derjenigediejenigedasjenige

dies werden Sie die numerischen die nur arbeiten , richtig sortiert:

SELECT 
    * 
    FROM YourTable 
    WHERE ISNUMERIC(YourColumn)=1 
    ORDER BY YourColumn 
+0

erstaunlich einfach! :-) Guter Anruf –

1
select 
    * 
from 
    sch.tbl 
order by 
    case isnumeric(shouldBeANumber) 
    when 1 then cast(shouldBeANumber as integer) 
    else 0 
    end 
0
SELECT 
    (CASE ISNUMERIC(shouldBeANumber) 
    WHEN 1 THEN 
     RIGHT(CONCAT('00000000',shouldBeANumber), 8) 
    ELSE 
     shouoldBeANumber) AS stringSortSafeAlpha 
ORDEER BY 
    stringSortSafeAlpha 

Dies wird führende Nullen für alle shouldBeANumber Werte hinzufügen, die wirklich Zahlen sind und lassen Sie alle verbleibenden va Lues allein. Auf diese Weise können Sie beim Sortieren eine Alpha-Sortierung verwenden, aber immer noch die richtigen Werte erhalten (bei einer Alpha-Sortierung wäre "100" kleiner als "50", aber wenn Sie "50" in "050" ändern) fein). In diesem Beispiel habe ich 8 führende Nullen hinzugefügt, aber Sie benötigen nur genügend führende Nullen, um die größtmögliche Ganzzahl in Ihrer Spalte abzudecken.

+0

es ist ISNUMERIC() und nicht ISNUMBER() –

+0

Danke, ich habe es behoben. – devuxer

0

Vorausgesetzt, dass Ihre Zahlen sind nicht mehr als 100 Zeichen lang:

WITH chars AS 
     (
     SELECT 1 AS c 
     UNION ALL 
     SELECT c + 1 
     FROM chars 
     WHERE c <= 99 
     ), 
     rows AS 
     (
     SELECT '1,2,5,7,5A,SECTION,SUPERCEDED' AS mynum 
     UNION ALL 
     SELECT '1,2,5,5A,7,SECTION,SUPERCEDED' 
     UNION ALL 
     SELECT 'SECTION,SUPERCEDED,1,2,5,5A,7' 
     UNION ALL 
     SELECT '5A,SECTION,SUPERCEDED,1,2,5,7' 
     ) 
SELECT rows.* 
FROM rows 
ORDER BY 
     (
     SELECT SUBSTRING(mynum, c, 1) AS [text()] 
     FROM chars 
     WHERE SUBSTRING(mynum, c, 1) BETWEEN '0' AND '9' 
     FOR XML PATH('') 
     ) DESC 
Verwandte Themen