Requête qui renvoi ttes les colonnes nulles

Fermé
doudou2015 - Modifié par Chris 94 le 27/05/2015 à 15:31
 doudou2015 - 4 juin 2015 à 09:45
Bonjour,




Bonjour,

j'ai une table qui contient 60 colonnes: ELEMENT(ID_ELEMENT, DATE_DEBUT, COEFFICIENT, COUT,...)

Je voudrais savoir comment peut on écrire une requête SQL qui renvoi les colonnes qui sont toujours vides = 'null' (jamais saisies).

Ce que j'ai comme solution c'est de tester chaque colonne individuellement avec la requête suivante :

SELECT COUNT (*) FROM ELEMENT WHERE COEFFICIENT IS NOT NULL;

Si elle renvoi 0, ça veut dire que toutes les lignes de ma table ELEMENT ont une valeur nulle pour la colonne COEFFICIENT.
Celle ci fonctionne bien, mais le problème ce que je ne peux pas le faire pour 60 colonnes !

Je vous pri de me proposer vos idées ! Merci d'avance

1 réponse

loulou_it Messages postés 2 Date d'inscription mercredi 3 juin 2015 Statut Membre Dernière intervention 3 juin 2015 1
3 juin 2015 à 15:46
Salut,

Tu peux faire un SQL dynamique, par exemple celui-ci te dit pour chaque table et chaque colonne le nombre de champs non nuls par rapport au nombre total de lignes...

declare
v_query varchar2 (2000);
v_count number;
v_result number;
type dyncurs is ref cursor;
c_cursor2 dyncurs;
cursor c_cursor is
select table_name, column_name
from all_tab_columns
where table_name in ('<Nom de ta table ou liste de tables>);
begin
for c in c_cursor loop
v_query := 'select count (1) from ' || c.table_name;
execute immediate v_query into v_count;
v_query := 'select count (1) from ' || c.table_name || ' where ' || c.column_name || ' is not null';
open c_cursor2 for v_query;
fetch c_cursor2 into v_result;
while c_cursor2%found loop
dbms_output.put_line (c.table_name || '.' || c.column_name || ' : ' || v_result || ' / ' || v_count);
fetch c_cursor2 into v_result;
end loop;
close c_cursor2;
end loop;
end;
/

0
Bonjour, merci beaucoup pour la réponse !
peux tu m'expliquer un peu plus le code ? je n'ai jamais utilisé des requêtes sql dynamique et je n'arrive pas à l'appliquer ..
Merci encore une fois :)
0