# Valeurs manquantes dans les requêtes SNDS
Crédits
Cette fiche a été rédigée par Albert Vuagnat - DREES
A savoir : Des références peuvent être données à la fin de la fiche. La dernière date de modification se situe tout en bas à droite.
# Leur prise en compte
La présence de valeurs manquantes peut avoir un impact non souhaité, s’il n’y est fait attention,
sur le résultat de requêtes SQL, lorsque les termes de la requête utilisent des fonctions impliquant des champs comportant des valeurs manquantes.
En effet, dans ce cas, un contenu vide (i.e. non défini) ne peut être évalué et le résultat de la fonction est à son tour une valeur manquante ce qui, à moins de le spécifier autrement, écarte la ligne du résultat de la requête.
A savoir
Tous les types de fonctions et de requêtes sont concernés: égalité, différence, calcul de fréquence, jointure entre des tables, etc.
Pour conserver des lignes comportant des valeurs manquantes dans les champs utilisés dans le résultat de la requête, il convient de l’indiquer expressément comme une modalité à retenir en définissant le périmètre de la requête.
La syntaxe SQL est fonction du moteur de la base de données utilisé.
La syntaxe
La base de données SNDS mise en œuvre par la Cnam utilise Oracle. Le terme qui désigne les valeurs
manquantes est null
avec ce moteur et non .
ou ‘’
comme en SAS. Pour l’employer dans une
requête SQL Oracle, il convient d’utiliser is null
ou is not null
et non = null
ou <> null
respectivement.
# Effet sur l'ordre de tri
Dans une requête SQL Oracle, la clause order by a pour effet de placer les éventuelles valeurs manquantes des champs utilisés pour opérer le tri, en dernier dans la table générée par la requête. Ceci est l’inverse pour le tri opéré directement (proc sort comme proc sql order by) dans SAS, où les valeurs manquantes sont considérées comme les plus petites des valeurs possibles et non une absence d’information placée en fin. Dès lors, pour une séquence de traitement où une table issue d’une requête Oracle est ensuite jointe à une table générée avec SAS, il apparait plus cursif de ne pas réaliser le tri dans SQL Oracle car il devra l’être, de toutes façon en cas de valeurs manquantes dans les clés de tri, avec une étape de tri dans SAS ; l’économie de la clause order by diminue le temps de réalisation de la requête SQL Oracle d’avantage que le temps du tri SAS.
# Exemples
En guise d’exemple, ces deux requêtes aux résultats différents, la première donnant toutes les lignes pour lesquelles figurent une valeur différente de 'C' et non manquante et la seconde qui inclus aussi les lignes avec valeur manquante:
proc sql;
%connectora;
create table temp as select * from connection to oracle
(select * from ir_nat_v where prs_nat_cb2 <> 'C');
disconnect from oracle;
quit;
proc sql;
%connectora;
create table temp2 as select * from connection to oracle
(select * from ir_nat_v where prs_nat_cb2 <> 'C' or prs_nat_cb2 is
null);
disconnect from oracle;
quit;
Le terme is null
peut aussi, et parfois doit, être utilisé en cas de jointure entre table notamment si l’on souhaite conserver des lignes avec des valeurs manquantes.
Pour poursuivre l’exemple ci-dessus, la requête suivante (limitée au 100 000 premiers) des actes dont le code nature de prestation n’a pas de lettre clé définie.
proc sql;
%connectora;
create table test as select * from connection to oracle
(select bse_prs_nat, prs_nat_cb2, exe_soi_dtd
from er_prs_f left outer join ir_nat_v on bse_prs_nat=prs_nat
where prs_nat_cb2 is null and bse_prs_nat <> 0 and rownum<10000);
disconnect from oracle;
quit;