6.10 SQL et l’information incomplète
159
© Dunod – La photocopie non autorisée est un délit.
A in E est équivalent à (A = a) or (A = b) or (A = c). On en déduit les règles
suivantes.
• Le prédicat prend la valeur true si A est l’un des éléments non null de E.
• Il prend la valeur unknown si (1) A = null ou si (2) A est non null, n’est égal
à aucun élément non null de E et E contient null.
• Dans les autres cas, le prédicat prend la valeur false.
En particulier, si A est null et E est vide, la valeur est unknown 20 .
Le prédicat not in s’étudie de manière similaire.
e) Les prédicats exists et not exists
Sont évalués à true ou false, jamais unknown. Attention, en présence de
valeurs null dans le corps de l’argument de ces prédicats, l’interprétation peut
être surprenante (voir exemple plus loin).
f) Les quantificateurs all et any
Les formes "A op any (E)" et "A op all (E)", où op est un opérateur de
comparaison et E une expression dont la valeur est une table, sont évaluées à
unknown ssi A vaut null ou E désigne un ensemble vide. Cependant certains
SGBD interprètent différemment la situation où A vaut null et E désigne un
ensemble vide [Date, 1992].
6.10.6 Les problèmes de l’information incomplète en SQL
La nature même de l’information incomplète, et plus encore la manière dont SQL
gère ses représentations induisent des problèmes d’interprétation et de cohérence qui
doivent rendre l’utilisateur particulièrement circonspect.
Montrons d’abord que SQL ne gère pas toujours la valeur null de manière cohérente.
a) En principe, nul n’est pas égal à null
Exécutons la requête suivante, qui donne un résultat sans surprise :
select NCLI from CLIENT where CAT is null
20. Assez maladroitement, la norme indique qu’un ensemble vide peut être considéré comme un
ensemble contenant la valeur null. Cependant ce cas particulier n’est pas traité de la même
manière par tous les SGBD [Date, 1992]. La requête select CAT from CLIENT where NCLI =
'D063' renvoie un résultat formé d’une ligne constituée d’une valeur null. Cependant, la
requête select count(CAT) from CLIENT where NCLI = 'D063' renvoie 0. Les deux résultats sont conformes à la norme mais sont cependant mathématiquement incohérents.
NCLI
K729
D063
Précédent

- 159/436

Suivant