2009-08-07 7 views
0

Je travaille avec une table qui provient d'une source externe et ne peut pas être "nettoyée". Il y a une colonne qui contient un nvarchar (20) et contient un entier environ 95% du temps, mais contient parfois un alpha. Je veux utiliser quelque chose commeSQL Server: trier une colonne numériquement si possible, sinon alpha

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

mais cela génère une erreur sur la cote « 3A » ou « D » ou la valeur « supplantées ».

Existe-t-il un moyen de dire "le trier comme un nombre si vous le pouvez, sinon juste trier par chaîne"? Je sais qu'il y a une certaine négligence dans cette déclaration, mais c'est essentiellement ce que je veux.

Disons que par exemple les valeurs étaient

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

Je serais heureux si ceux-ci ont été classés dans l'une des façons suivantes (parce que je vraiment besoin de travailler avec les numériques)

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 
+0

wow, c'était q uick! merci tout le monde – jlarson

Répondre

6

Je ne ai vraiment besoin de travailler avec les les numériques

cela vous donnera seulement les numériques , trié correctement:

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

incroyablement simple! :-) Bon appel –

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 

Cela va ajouter des zéros en tête à toutes les valeurs de shouldBeANumber qui sont vraiment des chiffres et laisser tout va restant Lues seul. De cette façon, lorsque vous triez, vous pouvez utiliser un tri alphabétique tout en obtenant les bonnes valeurs (avec un tri alpha, "100" sera inférieur à "50", mais si vous changez "50" en "050", cela fonctionne bien). Notez, pour cet exemple, j'ai ajouté 8 zéros en tête, mais vous n'avez besoin que de zéros en tête suffisants pour couvrir le plus grand nombre entier possible dans votre colonne.

+0

c'est ISNUMERIC() et pas ISNUMBER() –

+0

Merci, je l'ai corrigé. – devuxer

0

à condition que vos chiffres ne sont pas plus de 100 caractères:

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 
Questions connexes