356 votes

Comment vérifier si une colonne est vide ou nulle dans MySQL ?

J'ai une colonne dans un tableau qui peut contenir des valeurs nulles ou vides. Comment puis-je vérifier si une colonne est vide ou nulle dans les lignes présentes dans un tableau ?

(e.g. null or '' or '  ' or '      ' and ...)

1 votes

Code MySQL : select isnull(mycolumn) from mytable renvoie 1 si mycolumn est nulle.

2 votes

Que penser de length(trim(mycolumn)) > 0 ?

0 votes

Pour MSSQL > WHERE COLUMN <> '' OR WHERE LEN(COLUMN) > 0 OR WHERE NULLIF(LTRIM(RTRIM(COLUMN)), '') IS NOT NULL

540voto

maček Points 25640

Cela sélectionnera toutes les lignes où some_col est NULL ou '' (chaîne vide)

SELECT * FROM table WHERE some_col IS NULL OR some_col = '';

9 votes

Si vous changez la condition en WHERE some_col IS NULL OR some_col = ' ' (un espace inséré dans la chaîne) alors cela fonctionne à la fois sur MySQL et Oracle, voir la réponse de "onedaywhen". some_col = '' ne fonctionne pas sur Oracle car les chaînes vides signifient NULL là-bas.

2 votes

@Johanna mais si vous passez à ' ' alors il ne fonctionnera pas dans SQLite. Il ne gère que la correspondance identique/directe des chaînes de caractères.

158voto

onedaywhen Points 24594

Comme défini par la norme SQL-92, lors de la comparaison de deux chaînes de caractères de largeur différente, la valeur la plus étroite est complétée à droite par des espaces pour qu'elle soit de la même largeur que la valeur la plus large. Par conséquent, toutes les valeurs de chaînes de caractères qui sont entièrement constituées d'espaces (y compris les espaces zéro) seront considérées comme égales, par exemple

'' = ' ' IS TRUE
'' = '  ' IS TRUE
' ' = '  ' IS TRUE
'  ' = '      ' IS TRUE
etc

Par conséquent, cela devrait fonctionner quel que soit le nombre d'espaces composant le some_col valeur :

SELECT * 
  FROM T
 WHERE some_col IS NULL 
       OR some_col = ' ';

ou plus succinctement :

SELECT * 
  FROM T
 WHERE NULLIF(some_col, ' ') IS NULL;

9 votes

Merci d'avoir mentionné les espaces rembourrés. Vous pouvez en profiter et changer la condition en WHERE some_col IS NULL OR some_col = ' ' (un espace inséré dans la chaîne de caractères), il fonctionne à la fois sur MySQL et Oracle. some_col = '' ne fonctionne pas sous Oracle car les chaînes vides signifient NULL et la condition complète devient NULL.

0 votes

Mon exigence était de trouver SELECT * FROM T WHERE some_col IS NOT NULL OR same_col <> ' '; et SELECT * FROM T WHERE NULLIF(some_col, ' ') IS NOT NULL; a fonctionné pour moi dans MySQL. J'espère que cela vous sera utile.

0 votes

En fait, '' = ' ' fonctionne dans SQLServer mais pas dans SQLite, pour autant que je puisse le dire, en le testant maintenant.

93voto

Andomar Points 115404

Une façon plus courte d'écrire la condition :

WHERE some_col > ''

Depuis null > '' produit unknown ce qui a pour effet de filtrer à la fois null et des chaînes vides.

4 votes

Existe-t-il un moyen d'obtenir l'inverse, c'est-à-dire d'obtenir tous les enregistrements où il est NULL ou une chaîne vide ?

18 votes

@JoshPinter : coalesce(some_col, '') = ''

6 votes

Cela a peut-être été vrai à un moment donné, mais cela ne fonctionne pas dans MySQL 14.14.

37voto

Code Magician Points 8724

Vous pouvez tester si une colonne est nulle ou non nulle en utilisant WHERE col IS NULL ou WHERE col IS NOT NULL par exemple

SELECT myCol 
FROM MyTable 
WHERE MyCol IS NULL 

Dans votre exemple, vous avez plusieurs permutations d'espace blanc. Vous pouvez supprimer l'espace blanc en utilisant TRIM et vous pouvez utiliser COALESCE pour obtenir une valeur NULL par défaut (COALESCE retournera la première valeur non nulle parmi les valeurs que vous fournissez).

par exemple

SELECT myCol
FROM MyTable
WHERE TRIM(COALESCE(MyCol, '')) = '' 

Cette requête finale retournera les lignes où MyCol est nulle ou est une longueur quelconque d'espace.

Si vous pouvez l'éviter, il est préférable de ne pas avoir de fonction sur une colonne dans la clause WHERE, car cela rend difficile l'utilisation d'un index. Si vous souhaitez simplement vérifier si une colonne est nulle ou vide, il est préférable de procéder ainsi :

SELECT myCol
FROM MyTable
WHERE MyCol IS NULL OR MyCol =  '' 

Voir TRIM COALESCE et EST NUL pour plus d'informations.

Aussi Travailler avec des valeurs nulles Extrait de la documentation MySQL

5 votes

Vous présentez la vraie solution d'une manière très alambiquée. Vous présentez d'abord une solution incomplète à son problème "where mycol is null". Ensuite, vous présentez une solution utilisant deux fonctions imbriquées dans la clause where, tout en précisant que cela devrait être évité. Ce n'est qu'alors que vous arrivez à la vraie solution. À l'avenir, présentez d'abord votre vraie solution.

6voto

diEcho Points 22385

Essayez

SELECT 0 IS NULL ,  '' IS NULL , NULL IS NULL

-> 0, 0, 1

ou

SELECT ISNULL('  ') , ISNULL( NULL )
 -> 0 ,1

Référence

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X