web-dev-qa-db-fra.com

MySQL SELECT uniquement des valeurs non nulles

Est-il possible de faire une instruction select qui prend uniquement des valeurs NOT NULL?

En ce moment, j'utilise ceci:

SELECT * FROM table

Et puis je dois filtrer les valeurs nulles avec une boucle php.

Y a-t-il un moyen de faire:

SELECT * (that are NOT NULL) FROM table

?

À l'heure actuelle, lorsque je sélectionne *, j'obtiens val1, val2, val3, null, val4, val5, null, null, etc., mais je veux juste obtenir les valeurs qui ne sont pas nulles dans mon résultat. Est-ce possible sans filtrer avec une boucle?

243
bryan sammon

Vous devriez utiliser IS NOT NULL. (Les opérateurs de comparaison = et <> donnent tous les deux UNKNOWN avec NULL de part et d'autre de l'expression.)

SELECT * 
FROM table 
WHERE YourColumn IS NOT NULL;

Par souci d’exhaustivité, je mentionnerai que, dans MySQL, vous pouvez également annuler le opérateur d’égalité null safe mais ce n’est pas du code SQL standard.

SELECT *
FROM table 
WHERE NOT (YourColumn <=> NULL);

Edité pour refléter les commentaires. Il semble que votre table ne soit peut-être pas dans sa forme initiale normale, auquel cas changer de structure peut vous faciliter la tâche. Quelques autres façons de le faire cependant ...

SELECT val1 AS val
FROM  your_table
WHERE val1 IS NOT NULL
UNION ALL
SELECT val2 
FROM  your_table
WHERE val2 IS NOT NULL
/*And so on for all your columns*/

L'inconvénient de ce qui précède est qu'il analyse le tableau plusieurs fois pour chaque colonne. Cela peut éventuellement être évité par les options ci-dessous, mais je n’ai pas testé cela avec MySQL.

SELECT CASE idx
         WHEN 1 THEN val1
         WHEN 2 THEN val2
       END AS val
FROM   your_table
        /*CROSS JOIN*/
       JOIN (SELECT 1 AS idx
                   UNION ALL
                   SELECT 2) t
HAVING val IS NOT NULL  /*Can reference alias in Having in MySQL*/
419
Martin Smith

Vous pouvez filtrer les lignes contenant une valeur NULL dans une colonne spécifique:

SELECT col1, col2, ..., coln
FROM yourtable
WHERE somecolumn IS NOT NULL

Si vous voulez filtrer les lignes qui contiennent un null dans n'importe quelle colonne, essayez ceci:

SELECT col1, col2, ..., coln
FROM yourtable
WHERE col1 IS NOT NULL
AND col2 IS NOT NULL
-- ...
AND coln IS NOT NULL

Mise à jour: En fonction de vos commentaires, vous le souhaitez peut-être?

SELECT * FROM
(
    SELECT col1 AS col FROM yourtable
    UNION
    SELECT col2 AS col FROM yourtable
    UNION
    -- ...
    UNION
    SELECT coln AS col FROM yourtable
) T1
WHERE col IS NOT NULL

Et je conviens avec Martin que si vous avez besoin de le faire, alors vous devriez probablement changer la conception de votre base de données.

17
Mark Byers
Select * from your_table 
WHERE col1 and col2 and col3 and col4 and col5 IS NOT NULL;

Le seul inconvénient de cette approche est que vous ne pouvez comparer que 5 colonnes. Par la suite, le résultat sera toujours faux. Je ne compare donc que les champs pouvant être NULL.

12
Alan Chavez

J'ai trouvé cette solution:

Cette requête sélectionne la dernière valeur non NULL pour chaque colonne.

Exemple


Si vous avez une table:

id|title|body
1 |t1   |b1
2 |NULL |b2
3 |t3   |NULL

vous obtenez:

title|body
t3   |b2

Requete


SELECT DISTINCT (

  SELECT title
  FROM test
  WHERE title IS NOT NULL 
  ORDER BY id DESC 
  LIMIT 1
) title, (

  SELECT body
  FROM test
  WHERE body IS NOT NULL 
  ORDER BY id DESC 
  LIMIT 1
) body
FROM test

J'espère vous aider.

7
porquero

J'utilise la commande \! de MySQL pour extraire les valeurs NULL du shell:

\! mysql -e "SELECT * FROM table WHERE column = 123456\G" | grep -v NULL

Cela fonctionne mieux avec un .my.cnf correct où votre base de données/nom d'utilisateur/mot de passe est spécifié. De cette façon, il vous suffit d'entourer votre select avec \! mysql e et | grep -v NULL.

2
soulshake

La requête suivante fonctionne pour moi

quand j'ai défini la valeur par défaut de la colonne 'NULL' alors

select * from table where column IS NOT NULL

et quand j'ai mis la valeur par défaut rien alors

select * from table where column <>''
1
Basant

Oui, utilisez NOT NULL dans votre requête, comme ci-dessous.

SELECT * 
FROM table
WHERE col IS NOT NULL;
0
Jonathan Vasiliou

MYSQL IS NOT NULL AVEC JOINS ET SELECTIONNER, INSERER DANS, SUPPRIMER ET OPERATEUR LOGIQUE COMME OR, NOT

Using IS NOT NULL On Join Conditions

 SELECT * FROM users 
 LEFT JOIN posts ON post.user_id = users.id 
 WHERE user_id IS NOT NULL;

 Using IS NOT NULL With AND Logical Operator

 SELECT * FROM users 
 WHERE email_address IS NOT NULL 
 AND mobile_number IS NOT NULL;

Using IS NOT NULL With OR Logical Operator

 SELECT * FROM users 
 WHERE email_address IS NOT NULL 
 OR mobile_number IS NOT NULL;
0
Developer