2010-12-09 50 views
0

Je dois effectuer la commande par pour la colonne nvarchar. La question est-ce que la colonne n'a pas le même schéma d'entrée, par exemple de certaines lignes de la colonne sontOrdre par Clause pour la colonne NVARCHAR dans SQL Server

12  
9  
TEF  
78F  
T2R 

Comment trier cette colonne par ordre par article? Le seul soulagement que j'ai est que cette colonne contient seulement des caractères numériques et alphanumériques.

+2

Quel est le problème que vous rencontrez? Est-ce que 'order by ' ne fonctionne pas? –

+0

@Sachin Non, cela ne fonctionne pas correctement. En faisant cela, il semble que ce n'est pas du tout le tri des enregistrements – Zerotoinfinity

+0

Alors, comment trier votre colonne d'exemple? –

Répondre

4
ORDER BY 
    RIGHT(REPLICATE(N' ', 500) + MyValue, 500) 

Alors

9 
12 
78F 
T2R 
TEF 

devient

  9 
      12 
      78F 
      T2R 
      TEF 

qui triera correctement

Vous ne pouvez pas compter sur ISNUMERIC

+0

Merci! Fonctionne bien – Zerotoinfinity

+0

Pouvez-vous expliquer la logique que vous avez utilisée dans cette déclaration? Je suis nouveau dans le serveur sql – Zerotoinfinity

+0

Simplement, il ajoute des espaces principaux qui sont inclus dans le tri – gbn

0

Je suppose que ce problème est que ce n'est pas trier les chiffres et le texte correctement.

Cet article explique une approche:

How do I sort a VARCHAR column in SQL server that contains numbers?

de l'article:

select MyColumn 
from MyTable 
order by 
    case IsNumeric(MyColumn) 
     when 1 then Replicate(Char(0), 100 - Len(MyColumn)) + MyColumn 
     else MyColumn 
    end 
+2

IsNumeric est un mal pur, à moins que vous n'appréciez que '' 1d2 '' soit numérique, mais '' 1g2 '' ne l'est pas. –

+0

pouah! Note mentale à soi-même. +1 à votre question pour le signaler –

+0

@Damien_The_Unbeliever: Ceci est très intéressant - savez-vous où ce comportement est expliqué ou au moins documenté? – Tao

2
select 
    * 
from 
    table 
order by 
    CASE 
     WHEN not column like '%[^0-9]%' THEN CONVERT(int,column) 
     WHEN column like '[0-9]%' THEN CONVERT(int,SUBSTRING(column,1,PATINDEX('%[A-Z]%',column)-1)) 
    END, 
    CASE 
     WHEN not column like '%[^0-9]%' THEN NULL 
     WHEN column like '[0-9]%' THEN SUBSTRING(column,PATINDEX('%[A-Z]%',column),9000) 
     ELSE column 
    END 
+0

+1 pour la réponse la plus sensible, mais même alors, que faites-vous avec les décimales, la notation scientifique, etc? Le client ferait bien de définir le comportement souhaité – Tao