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?
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
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 .
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 ISNULL
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 ISNULLOR MyCol =''
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
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
SELECTIF(field1 ISNULLor field1 ='','empty', field1)as field1 from tablename
ou
SELECTcasewhen field1 ISNULLor field1 =''then'empty'else field1
endas field1 from tablename
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=NULLWHERE MyColumn='';SELECT*FROM MyTable WHERE MyColumn ISNULL
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.
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:
Utilisation de Trim pour vérifier
SELECT FirstName FROM UserDetails WHERE TRIM(LastName) IS NULL
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
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
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
select isnull(mycolumn) from mytable
renvoie 1 si mycolumn est null.Réponses:
Cela sélectionnera toutes les lignes où
some_col
estNULL
ou''
(chaîne vide)la source
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.' '
, cela ne fonctionnera pas dans SQLite. Il ne gère que la correspondance de chaîne identique / directe.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
Par conséquent, cela devrait fonctionner quel que soit le nombre d'espaces constituant la
some_col
valeur:ou plus succinctement:
la source
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.SELECT * FROM T WHERE some_col IS NOT NULL OR same_col <> ' ';
et deSELECT * FROM T WHERE NULLIF(some_col, ' ') IS NOT NULL;
travailler pour moi dans MySQL. J'espère que cela vous sera utile.'' = ' '
dans SQLServer mais pas dans SQLite, pour autant que je sache, de le tester maintenant.Une manière plus courte d'écrire la condition:
Puisque
null > ''
produitunknown
, cela a pour effet de filtrer lesnull
chaînes vides et les deux .la source
coalesce(some_col, '') = ''
Vous pouvez tester si une colonne est nulle ou non nulle en utilisant
WHERE col IS NULL
ouWHERE col IS NOT NULL
par exempleDans votre exemple, vous avez différentes permutations d'espace blanc. Vous pouvez supprimer les espaces blancs en utilisant
TRIM
et vous pouvez utiliserCOALESCE
par défaut une valeur NULL (COALESCE renverra la première valeur non nulle à partir des valeurs que vous spécifiez.par exemple
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:
Voir TRIM COALESCE et IS NULL pour plus d'informations.
Travailler également avec des valeurs nulles à partir des documents MySQL
la source
)
avant le=
signe dans votre deuxième exempleUne autre méthode sans OERE, essayez ceci ..
Sélectionne les valeurs vide et nulle
la source
Soit
ou
la source
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:
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.
la source
essayer
ou
Référence
la source
Cette déclaration est beaucoup plus nette et plus lisible pour moi:
la source
Lors de la vérification de la
null or Empty
valeur 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:
TRIM(), RTRIM(), LTRIM()
RTRIM(), LTRIM()
RTRIM(), LTRIM()
Comment vérifier vide / null: -
La syntaxe de ces fonctions de trim est la suivante:
Utilisation de Trim pour vérifier
SELECT FirstName FROM UserDetails WHERE TRIM(LastName) IS NULL
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
FirstName
fromUserDetails
si elle a un videLastName
En espérant que cela vous aidera :)
la source
Si vous souhaitez que les valeurs NULL soient présentées en dernier lors de la commande ORDER BY, essayez ceci:
la source
Vous pouvez aussi faire
L'inverse étant
la source
select NULL like ''
renvoieNULL
- au moins dans MySQL.la source
col1 != IFNULL(col2,'')
Vérifiez null
Vérifier vide
Cependant, vous devez toujours définir NOT NULL pour la colonne, l'
optimisation mysql ne peut gérer qu'un seul niveau IS NULL
la source
NULL
valeurs est un autre sujet de discussion. Je ne pense pas qu'il soit approprié de faire cette recommandation sans fournir votre raisonnement.-1
et''
.la source
RTRIM
etLTRIM
, mais pasTRIM
?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 recherchela source
essayez ceci si le type de données est une chaîne et que la ligne est nulle
si le type de données est int ou que la colonne est 0, essayez ceci
la source
la source
NULL
.