tfe Homepage

27/06/2008

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 :).