web-dev-qa-db-fra.com

MySQL select où la colonne n'est pas vide

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 où phone2 contient quelque chose.

161
mike

Compare la valeur de phone2 avec une chaîne vide:

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

Notez que la valeur NULL est interprétée en tant que false.

241
Ivan Nevostruev

Pour vérifier si le champ est NULL, utilisez les opérateurs IS NULL, IS NOT NULL.

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

44
Stanislav Stoyanov

Recherchez les valeurs de chaîne NULL et vide:

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

N.B. Je pense que COALESCE () est standard SQL (-ish), alors que ISNULL () ne l’est pas.

30
davek

S'il existe des espaces dans le champ phone 2 suite à une entrée 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,'')) <> '';
15
micahwittman

Une réponse que j’utilise a fonctionné pour moi et que je ne l’avais pas déjà vue ici (cette question est très ancienne, elle n’a peut-être pas fonctionné à ce moment-là) 

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

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

Fondamentalement, si le champ contient autre chose qu'un espace ou NULL, c'est vrai. Il est également très court, donc facile à écrire. Un autre avantage supplémentaire par rapport aux fonctions COALESCE() et IFNULL() est qu’il est compatible avec l’index, car vous ne comparez pas la sortie d’une fonction d’un champ.

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

UPDATEJe ne m'attendais pas à cela, mais les valeurs numériques nulles ou inférieures sont pas supérieures à une chaîne vide, donc si vous avez affaire à des nombres cela peut être nul ou négatif par rapport à NE PAS FAIRE , il m’a mordu très récemment et a été très difficile à déboguer :(

Si vous utilisez des chaînes de caractères (char, varchar, text, etc.), alors tout ira bien, soyez prudent avec les valeurs numériques. 

14
Brian Leishman
select phone, phone2 from jewishyellow.users 
where phone like '813%' and phone2 is not null
8
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é Null Fill, vous pouvez alors choisir "Not NULL", ce qui est évidemment meilleur.

4
Satanicpuppy

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
Atul

Utilisation:

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

vous pouvez utiliser le même caractère générique d'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 pouvez obtenir tous les phone2 qui ont un préfixe numérique.

0
Panda

Dans mon cas, j'avais une colonne varchar. Les méthodes IS NOT NULL et != '' ne fonctionnaient pas , mais les suivantes fonctionnaient pour moi. Il suffit de mettre ceci ici.

SELECT * FROM `db_name` WHERE `column_name` LIKE '%*%'
0
Mohd Abdul Mujib

Une autre alternative consiste à examiner spécifiquement le CHAR_LENGTH des valeurs de colonne. (à ne pas confondre avec LENGTH)

L'utilisation d'un critère dont la longueur de caractère est supérieure à 0 permet d'éviter les faux positifs lorsque les valeurs de colonne peuvent être falsey, comme dans le cas d'une colonne entière avec une valeur de 0 ou NULL. Comportement plus cohérent sur différents types de données.

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

Exemplehttps://www.db-fiddle.com/f/iQvEhY1SH6wfruAvnmWdj5/1

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

Données de la 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) > 0 Results (idem)

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

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

Alternatives

_ {phone2 <> '' Results} _ (différent)

users
813-123-4567       | 1

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

_ {phone2 > '' Results} _ (différent)

users
813-123-4567       | 1

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

_ {COALESCE(phone2, '') <> '' Results} _ (idem)
Remarque: les résultats diffèrent de phone2 IS NOT NULL AND phone2 <> '', ce qui n'est pas prévu}

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

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

_ {phone2 IS NOT NULL AND phone2 <> '' Results} _ (différent)

users
813-123-4567       | 1

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