web-dev-qa-db-fra.com

Oracle: Comment compter les lignes nulles et non nulles

J'ai une table avec deux colonnes qui pourraient être null (ainsi que d'autres colonnes). Je voudrais compter combien de lignes qui ont la colonne a, b, les deux et aucune des colonnes définies sur null.

Est-ce possible avec Oracle en une requête? Ou devrais-je créer une requête pour chacun? Vous ne pouvez pas utiliser group by ou d'autres éléments que je ne connais peut-être pas, par exemple?

21
Svish

COUNT(expr) comptera le nombre de lignes pour lesquelles expr n'est pas null, vous pouvez donc compter le nombre de null avec des expressions telles que:

SELECT count(a) nb_a_not_null,
       count(b) nb_b_not_null,
       count(*) - count(a) nb_a_null,
       count(*) - count(b) nb_b_null,
       count(case when a is not null and b is not null then 1 end)nb_a_b_not_null
       count(case when a is null and b is null then 1 end) nb_a_and_b_null
  FROM my_table
45
Vincent Malgrat

Quelque chose comme ça:

 SELECT sum (cas 
 Lorsque a est nul et b est nul, alors 1 
 Sinon 0 
 Fin) comme les deux, le nombre nul, 
 sum (case 
 lorsque a est null et b n'est pas null, alors 1 
 sinon 0 
 end) comme seul_a_is_null_count 
 FROM. votre_table 

Vous pouvez étendre cela pour d'autres combinaisons de null/not null

8
select sum(decode(a,null,0,1)) as "NotNullCount", sum(decode(a,null,1,0)) as "NullCount"
from myTable;

Répétez l'opération pour autant de champs que vous le souhaitez.

3
tbone

Cela peut être accompli dans Oracle juste en 1 rangée:

SELECT COUNT(NVL(potential_null_column, 0)) FROM table;

La fonctionNVLvérifie si le premier argument est nul et le traite comme une valeur du deuxième argument.

0
Vladimir Kishlaly

Une façon de le faire serait:

select count(*) from table group by nvl2(a, 0, 1), nvl2(b, 0, 1) having nvl2(a,0,1) = nvl2(b,0,1);
0
ds27680

Cela a bien fonctionné pour moi afin de compter le nombre total de cellules vides sur un groupe de colonnes dans une table dans Oracle: j'ai ajouté le trim pour compter les espaces vides comme nuls.

SELECT (sum(case 
           when trim(a) is null Then 1
           else 0
       end)) +
   (sum(case
           when trim(b) is null 
           else 0
       end)) +
   (sum(case
           when trim(c) is null 
           else 0
       end)) as NullCount
FROM your_table

J'espère que cela t'aides 

À votre santé.

0
Lorin Davis