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


288

J'ai une colonne dans une table qui peut contenir des valeurs nulles ou vides. Comment 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
Code MySQL: select isnull(mycolumn) from mytablerenvoie 1 si mycolumn est null.
Eric Leschinski

2
qu'en est-il de la longueur (trim (mycolumn))> 0?
Cyril Jacquart

Pour MSSQL> OERE LA COLONNE <> '' OU OERE LEN (COLONNE)> 0 OU OERE NULLIF (LTRIM (RTRIM (COLONNE)), '') N'EST PAS NUL
DxTx

Réponses:


444

Cela sélectionnera toutes les lignes où some_colest NULLou ''(chaîne vide)

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

7
Si vous changez la condition en WHERE some_col IS NULL OR some_col = ' '(un espace inséré dans la chaîne), 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.
Johanna

1
@Johanna mais si vous passez à ' ', cela ne fonctionnera pas dans SQLite. Il ne gère que la correspondance de chaîne identique / directe.
Magne

131

Comme défini par la norme SQL-92, lors de la comparaison de deux chaînes de largeurs différentes, la valeur la plus étroite est remplie à droite avec des espaces pour lui donner la même largeur que la valeur la plus large. Par conséquent, toutes les valeurs de chaîne 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 constituant la some_colvaleur:

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

ou plus succinctement:

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

6
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) puis cela fonctionne à la fois sur MySQL et Oracle. some_col = ''ne fonctionne pas sur Oracle car les chaînes vides signifient NULL et la condition complète devient NULL.
Johanna

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

Réellement '' = ' ' dans SQLServer mais pas dans SQLite, pour autant que je sache, de le tester maintenant.
Magne

66

Une manière plus courte d'écrire la condition:

WHERE some_col > ''

Puisque null > ''produit unknown, cela a pour effet de filtrer les nullchaînes vides et les deux .


2
Existe-t-il un moyen d'obtenir l'inverse de cela, d'obtenir tous les enregistrements où il est NULL ou une chaîne vide?
Joshua Pinter

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

6
Cela peut avoir été vrai parfois, mais ne fonctionne pas dans MySQL 14.14.
Gunnar Þór Magnússon

fonctionne très bien et est en fait le seul moyen pour moi de comprendre comment filtrer les champs nuls et vides dans MariaDB
Neal Davis

1
J'utilise some_col <> '' pour trouver l'inverse
Chargnn

18

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

SELECT myCol 
FROM MyTable 
WHERE MyCol IS NULL 

Dans votre exemple, vous avez différentes permutations d'espace blanc. Vous pouvez supprimer les espaces blancs en utilisant TRIMet vous pouvez utiliser COALESCEpar défaut une valeur NULL (COALESCE renverra la première valeur non nulle à partir des valeurs que vous spécifiez.

par exemple

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

Cette dernière requête renverra des lignes où MyCol est nul ou est n'importe quelle longueur d'espace blanc.

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 voulez simplement vérifier si une colonne est nulle ou vide, vous feriez mieux de faire ceci:

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

Voir TRIM COALESCE et IS NULL pour plus d'informations.

Travailler également avec des valeurs nulles à partir des documents MySQL


2
Vous présentez la vraie solution d'une manière très compliquée. Vous présentez d'abord une solution incomplète à son problème "où mycol est nul". Ensuite, vous présentez une solution utilisant deux fonctions imbriquées dans la clause where, même en disant que cela devrait être évité. C'est seulement alors que vous arrivez à la vraie solution. À l'avenir, présentez d'abord votre vraie solution.

Manquer un )avant le =signe dans votre deuxième exemple
Rorrim

15

Une autre méthode sans OERE, essayez ceci ..

Sélectionne les valeurs vide et nulle

SELECT ISNULL(NULLIF(fieldname,''))  FROM tablename

cela renvoie 1 s'il y a quelque chose de nul, pourquoi en est-il ainsi?
noobie-php

NULLIF vérifie le nom de champ pour la valeur vide et se convertirait en NULL s'il était vide. L'ISNULL renvoie 1 (vrai) si le NULLIF a réussi à changer un champ vide en NULL ou s'il était déjà NULL .... essayez par vous-même sur un champ nul et vide dans une table avec les deux fonctions séparées sélectionnez isnull (X) , sélectionnez nullif (y)
PodTech.io

9

Soit

SELECT IF(field1 IS NULL or field1 = '', 'empty', field1) as field1 from tablename

ou

SELECT case when field1 IS NULL or field1 = ''
        then 'empty'
        else field1
   end as field1 from tablename

6

Je déteste les champs en désordre dans mes bases de données. Si la colonne peut être une chaîne vide ou nulle, je préfère corriger cela avant de faire la sélection à chaque fois, comme ceci:

UPDATE MyTable SET MyColumn=NULL WHERE MyColumn='';
SELECT * FROM MyTable WHERE MyColumn IS NULL

Cela permet de garder les données en ordre, tant que vous n'avez pas spécifiquement besoin de faire la différence entre NULL et vide pour une raison quelconque.


5

essayer

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

-> 0, 0, 1

ou

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

Référence


5

Cette déclaration est beaucoup plus nette et plus lisible pour moi:

select * from my_table where ISNULL(NULLIF(some_col, ''));

4

Lors de la vérification de la null or Emptyvaleur d'une colonne de mon projet, j'ai remarqué qu'il existe des problèmes de support dans diverses bases de données.

Chaque base de données ne prend pas en charge TRIM méthode.

Ci-dessous est la matrice juste pour comprendre les méthodes prises en charge par différentes bases de données.

La fonction TRIM dans SQL est utilisée pour supprimer le préfixe ou le suffixe spécifié d'une chaîne. Le motif le plus courant supprimé est les espaces blancs. Cette fonction est appelée différemment dans différentes bases de données:

  • MySQL: TRIM(), RTRIM(), LTRIM()
  • Oracle: RTRIM(), LTRIM()
  • Serveur SQL: RTRIM(), LTRIM()

Comment vérifier vide / null: -

Voici deux façons différentes selon les différentes bases de données-

La syntaxe de ces fonctions de trim est la suivante:

  1. Utilisation de Trim pour vérifier

    SELECT FirstName FROM UserDetails WHERE TRIM(LastName) IS NULL

  2. Utilisation de LTRIM & RTRIM pour vérifier-

    SELECT FirstName FROM UserDetails WHERE LTRIM(RTRIM(LastName)) IS NULL

Les deux méthodes ci-dessus fournissent le même résultat, utilisez simplement en fonction de votre prise en charge DataBase. Il retourne juste la table FirstNamefrom UserDetailssi elle a un videLastName

En espérant que cela vous aidera :)


3

Si vous souhaitez que les valeurs NULL soient présentées en dernier lors de la commande ORDER BY, essayez ceci:

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

3

Vous pouvez aussi faire

SELECT * FROM table WHERE column_name LIKE ''

L'inverse étant

SELECT * FROM table WHERE column_name NOT LIKE ''

Apparemment, ne fonctionne pas: select NULL like ''renvoie NULL- au moins dans MySQL.
Titus

2
SELECT * FROM tbl WHERE trim(IFNULL(col,'')) <> '';

J'ai eu un problème par rapport à un champ qui était parfois nul. Cela a aidé:col1 != IFNULL(col2,'')
webaholik

1

Vérifiez null

$column is null
isnull($column)

Vérifier vide

$column != ""

Cependant, vous devez toujours définir NOT NULL pour la colonne, l'
optimisation mysql ne peut gérer qu'un seul niveau IS NULL


3
Ne jamais accepter de NULLvaleurs est un autre sujet de discussion. Je ne pense pas qu'il soit approprié de faire cette recommandation sans fournir votre raisonnement.
2011

J'ai inclus, soyez patient. De plus, c'est vraiment rendre la vie difficile en utilisant NULL (tout comme cette question).
ajreal

5
C'est une terrible recommandation. La définition de NOT NULL sur une colonne dont la valeur peut ne pas être connue au moment de INSERT ne sert qu'à encourager l'utilisation de valeurs "null" non standard comme -1et ''.
Dan Bechard

@Dan si vous n'êtes pas sûr de la valeur lors de l'insertion, vous pouvez avoir des difficultés à effectuer toute optimisation possible
ajreal

0
select * from table where length(RTRIM(LTRIM(column_name))) > 0

1
Quel est l'intérêt d'utiliser les deux RTRIMet LTRIM, mais pas TRIM?
Nico Haase

0

Dans mon cas, l'espace a été entré dans la colonne lors de l'importation des données et bien qu'il ressemblait à une colonne vide, sa longueur était de 1. Donc, tout d'abord, j'ai vérifié la longueur de la colonne vide en utilisant length(column)puis en fonction de cela, nous pouvons écrire une requête de recherche

SELECT * FROM TABLE WHERE LENGHT (COLUMN) = longueur de la colonne pour la colonne vide


-1

essayez ceci si le type de données est une chaîne et que la ligne est nulle

SELECT * FROM table WHERE column_name IS NULL OR column_name = ''

si le type de données est int ou que la colonne est 0, essayez ceci

SELECT * FROM table WHERE column_name > = 0

-2
SELECT column_name FROM table_name WHERE column_name IN (NULL, '')

1
Mauvaise réponse. Cela ne sélectionnera pas NULL.
Pang
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.