Filtrage non égalitaire avec Oracle

Ce titre d’article semble bateau au premier abord mais il me semble essentiel de parler de cette expérience pour le moins « étrange » avec un filtre sur j’ai effectué sur Oracle ces jours-ci.

Le filtre suivant :

1
WHERE maColonne != 'uneValeur'

renvoi, contrairement à ce que j’aurai pensé, toutes les lignes de ma table dont la colonne « maColonne » est différente de ‘uneValeur’ (jusque là tout va bien) mais également les lignes où « maColonne » IS NULL !

Et oui il semblerait qu’il faille rajouter

1
OR maColonne IS NOT NULL

Exemple :

1
2
3
4
5
6
7
8
9
10
11
12
13
SELECT *
FROM
(
    SELECT null as maColonne
    FROM dual
        UNION
    SELECT 'uneValeur'
    FROM dual
        UNION
    SELECT 'uneAutreValeur'
    FROM dual
)
where maColonne != 'uneValeur'

Renvoi une seule ligne alors que

1
2
3
4
5
6
7
8
9
10
11
12
13
14
SELECT *
FROM
(
    SELECT null as maColonne
    FROM dual
        UNION
    SELECT 'uneValeur'
    FROM dual
        UNION
    SELECT 'uneAutreValeur'
    FROM dual
)
where (maColonne != 'uneValeur'
OR maColonne IS NULL)

renvoi bien deux lignes…

Laisser un commentaire