2008-06-27-ean
Contraire d'une requête SQL
Prenons une table toute simple:
create table matable (id serial, nombre varchar NULL);
Insérons-y 3 lignes:
insert into matable (nombre) VALUES (0); insert into matable (nombre) VALUES (1); insert into matable;
Maintenant sélectionnons les lignes ayant un nombre=1 (1 résultat)
select id,nombre from matable where nombre=1;
Pour inverser la requête donc: (1 résultat)
select id,nombre from matable where nombre!=1;
Nous remarquons que la ligne ayant un nombre=NULL n'a pas été sélectionnée...
La fonction SQL coalesce nous permet de palier a ce problème de manière simple: cette fonction selectionne le premier element non null d une liste:
select coalesce(nombre,-1) from matable nous retourne l'ensemble des nombre, remplaçant les NULL par des -1.
Pour inverser la requête nous pouvons donc faire:
select id,nombre from matable where coalesce(nombre,0) != 1;
Note: Nous aurions aussi pu faire select id,nombre from matable where nombre!=1 or nombre is null , mais du coup il n'y aurait pas eu d'astuce :).