ProgrammationDéveloppeur SQL

Expliquez comment fonctionne le traitement des NULL en SQL. Quels dangers présentent des valeurs NULL inattendues, comment faut-il travailler avec elles, et quelles erreurs typiques sont rencontrées ?

Réussissez les entretiens avec l'assistant IA Hintsage

Réponse.

En SQL, la valeur NULL signifie "inconnue" ou "absence de" valeur. Elle se comporte de manière particulière :

  • Une comparaison de NULL avec n'importe quelle valeur par = ou <> donne toujours un résultat UNKNOWN, et non TRUE ou FALSE.
  • Il faut vérifier la présence de NULL à l'aide de IS NULL ou IS NOT NULL.
  • Toute opération arithmétique ou logique avec NULL donnera NULL.

Exemple :

SELECT * FROM users WHERE name = NULL; -- ne renverra aucune ligne SELECT * FROM users WHERE name IS NULL; -- correct SELECT 1 + NULL; -- Résultat : NULL

Pour remplacer NULL, on utilise des fonctions comme COALESCE(foo, 0) (prend la première valeur non-NULL) ou ISNULL(foo, 'default') dans SQL Server.

Question piège.

Question : Quel résultat renverra la condition WHERE some_column <> 'value' dans les lignes où some_column est NULL ?

Réponse :

Dans ces lignes, la condition ne sera pas satisfaite : la comparaison avec NULL donnera UNKNOWN, et non TRUE. Par conséquent, les lignes avec NULL ne seront pas incluses dans la sélection.

Exemple :

-- some_column | ... -- NULL | ... -- 'abc' | ... -- 'value' | ... SELECT * FROM table WHERE some_column <> 'value'; -- La ligne avec NULL ne sera pas incluse

Histoire

Dans le rapport bancaire, la condition WHERE status <> 'closed' ne tenait pas compte des comptes avec la valeur status = NULL (par exemple, les nouvelles demandes). En conséquence, le nombre de comptes actifs a été incorrectement compté — le nombre s'est avéré 15 % inférieur.

Histoire

Dans un service Internet de personnalisation d'e-mails, COALESCE(user_name, 'Cher client') a été oublié dans l'envoi. Près d'un millier de clients ont reçu des messages sans nom du tout, ce qui a été perçu comme une erreur d'automatisation.

Histoire

Lors de la migration de la base, LEFT JOIN renvoyait plus de lignes que prévu. Il s'est avéré que la table de gauche contenait des champs avec NULL; des filtres de type WHERE b.field = 'X' après le JOIN rejetaient ces lignes, entraînant une perte de parties des données.