2009-08-28 8 views
6

ceci est mon code pour l'instant:Trier par null, puis commander par d'autres variables

SELECT id, number 
FROM Media 
WHERE user = 10 
ORDER BY id, number 

mais je veux que ça ressemble à:

SELECT id, number 
FROM Media 
WHERE user = 10 
ORDER BY while(number IS NULL), id 

Ce que je veux faire est d'avoir tous number qui sont NULL sur le dessus du résultat, mais dès number n'est pas NULL, trier par id

est-ce possible?

J'utilise mysql.

Répondre

19

ce que quelque chose comme ceci:

SELECT id, number 
FROM Media 
WHERE user = 10 
ORDER BY (case when number is null then 0 else 1 end), id 

Si le numéro est NULL, le premier ordre par des critères sera de 0;

Et notez que les identifiants seront également triés, de toute façon.

Vous obtiendrez quelque chose comme ceci:

  • Numéro nul; id = 1
  • nombre nul; id = 2
  • nombre nul; id = 5
  • nombre nul; id = 8
  • nombre non nul; id = 3
  • nombre non nul; id = 4
  • nombre non nul; id = 7
  • nombre non nul; id = 10
  • nombre non nul; id = 12
+0

C'est comme ça que je le fais aussi normalement. – RiddlerDev

+0

Excellent! Réponse rapide, et cela a fonctionné la première fois que j'ai essayé. Je vous remercie! – Johan

+0

De rien :-) amusez-vous! –

-1

Union peut également être utilisée.

SELECT id, number 
FROM Media 
WHERE user = 10 AND number IS NULL 
ORDER BY id 

UNION 

SELECT id, number 
FROM Media 
WHERE user = 10 AND number IS NOT NULL 
ORDER BY id, number; 
+0

Mis à part une syntaxe légèrement fausse (parenthèses manquantes), cela n'aura pas de sens car l '«UNION» ne garantit pas la préservation de l'ordre des sélections individuelles. En outre, cela produit un plan d'exécution inutilement coûteux (deux vérifications 'NULL' sur la colonne' number'). –

1

La fonction ISNULL() renvoie 1 si le paramètre est null et 0 dans le cas contraire.

SELECT id, number 
FROM Media 
WHERE user = 10 
ORDER BY ISNULL(number) DESC, id 

Rappelez-vous, terrible pour la performance en fonction du nombre de valeurs dont il a besoin à l'ordre: aucun index sera utilisé en fonction de l'ordre des colonnes.

Questions connexes