2011-05-29 5 views
6

J'ai une table contenant 2 types de texte à l'intérieur d'une colonne. Le premier type est une chaîne d'adresse email (ex [email protected]) et le second est un nom de personne (John Doe)SQlite ordre par requête

J'utilise cette requête pour trier les données afin que les premières lignes ne ont le char @ sont indiqués et ceux qui ne l'ont:

SELECT * 
    FROM Name 
ORDER BY CASE 
      WHEN displayName LIKE '%@%' THEN 1 
      ELSE 2 
     END 

donc ce que je suis incapable de faire est d'obtenir les cas à trier ascendant de sorte que j'ai les noms classés par lettre croissant suivant les e-mails trié par lettre ascendante.

Répondre

13

Utilisation:

SELECT n.* 
    FROM NAME n 
ORDER BY CASE 
      WHEN displayName LIKE '%@%' THEN 1 
      ELSE 2 
     END, n.displayname COLLATE NOCASE 

Les ORDER BY supports de clause plus d'une colonne, mais la priorité est lue de gauche à droite. Ainsi, les valeurs displayname avec un «@» dans eux sont en haut, puis classés par la valeur displayname en ce que chaque regroupement (basé sur l'instruction CASE).

Vous devez regarder en utilisant le COLLATE operator pour la comparaison insensible à la casse.

+0

ok ça marche mais pas complètement. il faut prendre en compte si la lettre est mise en évidence ou non. il me donne ceux qui commencent par la lettre d'abord classés par ordre alphabétique, puis ceux qui commencent par des lettres minuscules triées par ordre alphabétique, puis il fait de même avec les courriels. – DArkO

+0

Ok, je l'ai compris. ajouté UPPER (displayName) après la fin, – DArkO

+0

@DArko: 'COLLATE' offre plus de fonctionnalités - voir mise à jour. –

3

Fondamentalement, il ressemblerait à ceci:

Select * 
FROM Name 
Order by case when displayName LIKE '%@%' then 1 else 2 end, displayName 

Vous êtes juste ajouter une deuxième option à trier sur la liste. Cela va trier d'abord par la colonne 1 ou 2 et ensuite il va trier ces résultats par le nom réel.

Si votre collation ne permet pas le genre que vous voulez, vous pouvez modifier la clause ORDER BY légèrement pour accueillir cette façon:

Select * 
FROM Name 
Order by case when displayName LIKE '%@%' then 1 else 2 end, UPPER(displayName)