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?
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*/
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.
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
.
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.
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
.
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 <>''
Oui, utilisez NOT NULL
dans votre requête, comme ci-dessous.
SELECT *
FROM table
WHERE col IS NOT NULL;
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;