MySQL sélectionnez où la colonne n'est pas vide


182

Dans MySQL, puis-je sélectionner des colonnes uniquement là où quelque chose existe?

Par exemple, j'ai la requête suivante:

select phone, phone2
from jewishyellow.users
where phone like '813%'
and phone2

J'essaie de sélectionner uniquement les lignes où le téléphone commence par 813 et phone2 contient quelque chose.


2
Pouvez-vous clarifier ce que vous entendez par « phone2contient quelque chose»? Les gens se demandent si vous voulez dire phone2IS NOT NULL, n'est pas vide, n'est pas exclusivement des espaces blancs, etc.
Pilcrow

1
si "quelque chose" existe, il n'est évidemment pas nul.
mike

Réponses:


277

Comparez la valeur de phone2avec une chaîne vide:

select phone, phone2 
from jewishyellow.users 
where phone like '813%' and phone2<>''

Notez que la NULLvaleur est interprétée comme false.


5
Guillemets simples, pas guillemets doubles.
OMG Ponies

2
phone2<>""ne franchira aucun vérificateur de syntaxe SQL.
OMG Ponies

5
@OMG Ponies: Mais cela fonctionne dans mysql. C'est le seul vérificateur qui compte
Ivan Nevostruev

7
@ivan: Des nouvelles pour moi, désolé pour ça.
OMG Ponies

<> est identique à! =. c'était simple. mais je ne savais pas :)
MFarooqi

48

Pour vérifier si le champ est utilisé NULL IS NULL, les IS NOT NULLopérateurs.

Référence MySql http://dev.mysql.com/doc/refman/5.0/en/working-with-null.html


10
OP demande uniquement les lignes contenant quelque chose dans le champ phone2. IS NOT NULL renvoie tout ce qui n'est littéralement pas défini sur NULL, même la chaîne vide "". ! = '', ou <> '' comme Ivan l'a dit dans la réponse acceptée, ne renverra pas de chaînes vides ou de valeurs NULL. En d'autres termes, IS NOT NULL est un sous-ensemble de! = '', Mais ils ne sont pas équivalents.
Aucun

34

Vérifiez NULLet videz les valeurs de chaîne:

select phone
, phone2 
from users 
where phone like '813%' 
and trim(coalesce(phone2, '')) <>''

NB Je pense que COALESCE () est le standard SQL (-ish), alors que ISNULL () ne l'est pas.


1
Vous n'avez pas besoin d'utiliser la fonction trim, car dans MySQL une chaîne de n'importe quel nombre d'espaces est égale à une autre chaîne de n'importe quel nombre d'espaces, j'ai écrit en réponse à ce sujet de manière assez détaillée stackoverflow.com/a/ 42723975/728236
Brian Leishman

26

Une réponse que j'utilise et qui fonctionne assez bien pour moi que je n'ai pas déjà vue ici (cette question est très ancienne, donc elle n'a peut-être pas fonctionné à l'époque) est en fait

SELECT t.phone, 
       t.phone2 
  FROM jewishyellow.users t
 WHERE t.phone LIKE '813%' 
   AND t.phone2 > ''

Notez la > ''partie, qui vérifiera si la valeur n'est pas nulle et si la valeur n'est pas simplement un espace ou un blanc.

Fondamentalement, si le champ contient quelque chose d'autre qu'un espace blanc ou NULL, c'est vrai. Il est aussi super court, il est donc facile d'écrire, et un autre plus sur COALESCE()etIFNULL() fonctions est que cela est compatible avec les index, car vous ne comparez pas la sortie d'une fonction sur un champ à quoi que ce soit.

Cas de test:

SELECT if(NULL > '','true','false');-- false
SELECT if('' > '','true','false');-- false
SELECT if(' ' > '','true','false');-- false
SELECT if('\n' > '','true','false');-- false
SELECT if('\t' > '','true','false');-- false
SELECT if('Yeet' > '','true','false');-- true

MISE À JOUR Il y a une mise en garde à ce que je ne m'attendais pas, mais les valeurs numériques qui sont nulles ou inférieures ne sont pas supérieures à une chaîne vide, donc si vous avez affaire à des nombres qui peuvent être nuls ou négatifs, NE FAITES PAS CELA , cela m'a mordu très récemment et a été très difficile à déboguer :(

Si vous utilisez des chaînes (char, varchar, text, etc.), alors ce sera parfaitement bien, faites juste attention aux chiffres.


17

S'il y a des espaces dans le champ phone2 suite à une saisie de données par inadvertance, vous pouvez ignorer ces enregistrements avec les fonctions IFNULL et TRIM:

SELECT phone, phone2
FROM jewishyellow.users
WHERE phone LIKE '813%'
    AND TRIM(IFNULL(phone2,'')) <> '';

Vous n'avez pas besoin d'utiliser la fonction trim, car dans MySQL une chaîne de n'importe quel nombre d'espaces est égale à une autre chaîne de n'importe quel nombre d'espaces, j'ai écrit en réponse à ce sujet de manière assez détaillée stackoverflow.com/a/ 42723975/728236
Brian Leishman

7
select phone, phone2 from jewishyellow.users 
where phone like '813%' and phone2 is not null

6
Notez qu'il existe une différence entre une NULLvaleur et une chaîne vide ''qui est une valeur. Si vous voulez vérifier une chaîne vide, utilisez column <> ''comme suggéré par les autres réponses.
Dzhuneyt

7
SELECT phone, phone2 
FROM jewishyellow.users 
WHERE phone like '813%' and (phone2 <> "");

Peut nécessiter quelques ajustements en fonction de votre valeur par défaut. Si vous avez autorisé le remplissage Null, vous pouvez faire "Not NULL" à la place, ce qui est évidemment mieux.


Je ne vais pas vous marquer mais: 1) Il n'y a pas de NOT()fonction dans MySQL 2) phone2=""ne le fera pas passer un vérificateur de syntaxe SQL.
OMG Ponies

1
Heh, désolé. J'utilise beaucoup de serveurs SQL différents.
Satanicpuppy

2

Nous pouvons utiliser CASE pour définir une valeur vide sur un caractère ou une chaîne. J'utilise NA comme chaîne par défaut.

SELECT phone,   
CASE WHEN phone2 = '' THEN 'NA' END AS phone2 ELSE ISNULL(phone2,0) 
FROM jewishyellow.users  WHERE phone LIKE '813%'

2

Une autre alternative consiste à examiner spécifiquement CHAR_LENGTHles valeurs des colonnes. (à ne pas confondre avec LENGTH)

L'utilisation d'un critère où la longueur des caractères est supérieure à 0, évitera les faux positifs lorsque les valeurs de colonne peuvent être fausses, comme dans le cas d'une colonne entière avec une valeur de 0ouNULL . Se comporter de manière plus cohérente sur différents types de données.

Ce qui donne une valeur d'au moins 1 caractère ou non vide.

Exemple https://www.db-fiddle.com/f/iQvEhY1SH6wfruAvnmWdj5/1

SELECT phone, phone2
FROM users
WHERE phone LIKE '813%'
AND CHAR_LENGTH(phone2) > 0

Données de table

users
phone (varchar 12) | phone2 (int 10)
"813-123-4567"     | NULL
"813-123-4567"     | 1
"813-123-4567"     | 0

users2
phone (varchar 12) | phone2 (varchar 12)
"813-123-4567"     | NULL
"813-123-4567"     | "1"
"813-123-4567"     | "0"
"813-123-4567"     | ""

CHAR_LENGTH(phone2) > 0Résultats (identiques)

users
813-123-4567       | 1
813-123-4567       | 0

users2
813-123-4567       | 1
813-123-4567       | 0

Alternatives

phone2 <> ''Résultats (différents)

users
813-123-4567       | 1

users2
813-123-4567       | 1
813-123-4567       | 0

phone2 > ''Résultats (différents)

users
813-123-4567       | 1

users2
813-123-4567       | 1
813-123-4567       | 0

COALESCE(phone2, '') <> ''Résultats (identiques)
Remarque: les résultats diffèrent de phone2 IS NOT NULL AND phone2 <> ''ce qui n'est pas attendu

users
813-123-4567       | 1
813-123-4567       | 0

users2
813-123-4567       | 1
813-123-4567       | 0

phone2 IS NOT NULL AND phone2 <> ''Résultats (différents)

users
813-123-4567       | 1

users2
813-123-4567       | 1
813-123-4567       | 0

2

Étonnamment (comme personne d'autre ne l'a mentionné auparavant) a constaté que la condition ci-dessous fait le travail:

WHERE ORD(field_to_check) > 0 

lorsque nous devons exclure les valeurs nulles et vides. Quelqu'un est-il conscient des inconvénients de l'approche?


J'ai essayé pendant des heures d'obtenir la syntaxe correcte et cela a tout résolu merci!
demo7up

1

Utilisation:

SELECT t.phone, 
       t.phone2 
  FROM jewishyellow.users t
 WHERE t.phone LIKE '813%' 
   AND t.phone2 IS NOT NULL

1
J'ai remarqué que parfois IS NOT NULLn'est pas appliqué aux colonnes de chaînes uniquement avec des valeurs vides ( ''). Je ne sais pas pourquoi, mais je voulais juste le souligner. Il est plus sage de l'utiliser t.phone2 <> ''lors de la vérification des colonnes de chaîne vides.
Dzhuneyt

0

vous pouvez utiliser un caractère générique comme opérateur pour y parvenir:

SELECT t.phone, 
       t.phone2 
FROM jewishyellow.users t
WHERE t.phone LIKE '813%' 
  AND t.phone2 like '[0-9]';

de cette façon, vous pourriez obtenir tous les phone2 qui ont un préfixe numérique.


0

Dans mon cas, j'avais une colonne varchar, les deux méthodes de IS NOT NULL& != '' ne fonctionnaient pas , mais les suivantes ont fonctionné pour moi. Juste mettre ça ici.

SELECT * FROM `db_name` WHERE `column_name` LIKE '%*%'
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.