Bonjour,
JE simplifie évidemment énormément le cas concret, mais admettons qu’on ait la table suivante avec ses données:
create table test (
id int not null,
nom1 varchar(255),
nom2 varchar(255),
primary key(id));
insert into test
(id, nom1, nom2)
values
(1, 'Elodie', null),
(2, null, 'David'),
(3, null, 'Bob'),
(4, 'Alice', null),
(5, 'Cedric', null);
Existe-t-il une requête pour me retourner les données triées par ordre alphabétique à la fois sur nom1 et nom2 ?
select id, nom1, nom2 from test
order by ??????
J’aimerais obtenir:
id, nom1, nom2
4, Alice, null
3, null, Bob
5, Cedric, null
2, null, David
1, Elodie, null
Sachant que pour une entrée donnée, une seule des deux colonnes nom1 et nom2 ne sont remplies à la fois tandis que l’autre est nécessairement null. Nom1 et nom2 ne peuvent pas être remplies en même temps, et il ne peut pas y avoir non plus d’entrée avec deux fois null.
Ce serait évidemment beaucoup plus simple d’avoir tout dans une seule et même colonne, mais ça, ce n’est pas moi qui l’ai choisi et je ne peux pas le changer (dans le cas réel, nom1 et nom2 proviennent de jointures sur des tables différentes). Je n’ai pas non plus la possibilité de construire une telle colonne à l’avance (interdiction de changer la structure des données).
Avant de dire que c’est trop facile, la requête suivante par exemple ne donne pas le résultat voulu dans le bon ordre:
select id, nom1, nom2 from test
order by nom1 nulls last, nom2 nulls last;
----------
4, Alice, null
5, Cedric, null
1, Elodie, null
3, null, Bob
2, null, David
Est-ce que je suis condamné à faire le tri après coup dans le langage client (en l’occurence Java dans mon cas, mais ça n’a pas beaucoup d’importance), ou bien est-ce qu’il existe une solution en SQL (si possible non spécifique à un SGBD donné) ?
Question bonus: dans mon cas concret, j’ai trois colonnes nom1, nom2 et nom3, et non pas seulement deux ! Est-ce que c’est toujours faisable ? Toujours avec une seule et unique colonne remplie à la fois et interdiction de modifier la structure existante.
Merci pour vos réponses !