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.
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
.
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
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.
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,'')) <> '';
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.
select phone, phone2 from jewishyellow.users
where phone like '813%' and phone2 is not null
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.
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%'
Utilisation:
SELECT t.phone,
t.phone2
FROM jewishyellow.users t
WHERE t.phone LIKE '813%'
AND t.phone2 IS NOT NULL
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.
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 '%*%'
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.
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