9
votes

Oracle: Trouver des colonnes avec seulement des valeurs null

J'ai une table avec beaucoup de colonnes et une colonne de type.

Certaines colonnes semblent toujours être vides pour un type spécifique.

Je souhaite créer une vue pour chaque type et afficher uniquement les colonnes correspondantes pour chaque type. Travailler sous l'hypothèse selon laquelle si une colonne n'a que des valeurs NULLL pour un type spécifique, ces colonnes ne doivent pas faire partie de la vue, comment pouvez-vous constater cela avec des requêtes?

y a-t-il un Sélectionnez [Nomname] à partir de [Tableau] où [ColumnValues] sont tous [NULL]

Je sais que je l'ai complètement fait au-dessus ... J'essaie juste d'avoir l'idée de l'autre. Merci d'avance!


4 commentaires

Donc, si vous avez 50 colonnes et que 10 d'entre elles ne contiennent que des valeurs NULLL, vous souhaitez qu'une requête ne renvoie que les 40 colonnes qui disposent de données? Et probablement si l'un des 10 autres acquiert une valeur, votre requête retournerait alors 41 colonnes?


On dirait que vous avez des "types" différents ou des "types" d'enregistrements dans la même table, où vous souhaitez avoir une vue séparée pour chacun. Y a-t-il une colonne qui identifie le "type" de l'enregistrement?


Oui c'est correct @codebymonlight.


Oui @Adam Hawkes. J'ai une colonne appelée "type" et je souhaite créer une vue pour chaque séparée, tout en retirant tout l'encombrement.


8 Réponses :


-1
votes

quelque chose comme ça? XXX

Évidemment, vous pouvez l'utiliser dans une vue Créer ... Déclaration si vous le souhaitez aussi. < / p>


8 commentaires

Outre le fait que cela ne sélectionne pas de colonnes, cela ne dit même pas quand "[Columnvalues] sont tous [null]". Cela sélectionnera un groupe de lignes où certaines colonnes (pour cette ligne) sont NULL - ce n'est pas des informations utiles pour déterminer quelles colonnes sont toutes NULL


@Gerrat, Oracle n'a pas de concept d'un mot-clé à la clause de condition d'un Sélectionnez (voir download.oracle.com/docs/cd/b13789_01/server.101/b10759/... ). Si @ Jorge veut créer des vues différentes pour chaque "type", il doit déterminer si le "type" est basé sur un discriminateur de colonne ou par la présence de colonnes NULL spécifiques pour tous les enregistrements de ce type. Il semble confondre les deux méthodes.


@BQ: Cela ne concerne pas un mot-clé mystique tout . C'est à propos de ce que OP essaie d'obtenir. Je pense que si vous relisez à nouveau ce qu'il cherche, il est assez clair du contexte que ce qu'il est après est essentiellement: "Donnez-moi les noms de colonnes des colonnes pour lesquelles chaque ligne de cette colonne est null, pour un type particulier." ... Donc, votre SQL renvoie des lignes au lieu des noms de colonne, et les lignes qu'il donne ne nous rapprochent pas vraiment de savoir si chaque ligne de cette colonne est null. Il s'agit simplement de revenir des lignes où (chaque colonne d'un ensemble donné de colonnes) est null


@BQ: Une façon de faire dans quelle option demande peut être une procédure stockée qui: 1. Trouvez des valeurs distinctes pour le type type col; 2. Lisez les noms de colonne d'une table de métadonnées comme All_Tab_Columns; 3. Trouvé toutes les colonnes qui avaient des valeurs non nulles pour chaque type; 4. Création d'une vue pour chaque type à l'aide de SQL dynamique et des colonnes de (3). ... un peu de travail juste,


@Gerrat, je pensais à la même chose moi-même (concernant A_T_C) et à mettre en place un exemple, mais la création de vues est quelque chose que vous faites une ou deux fois. À la recherche manuelle du résultat d'une requête et de sensibiliser la vue à cela est presque meilleur que la génération automatique d'une partie basée sur les données actuelles. Si l'OP consiste à recréer des vues en fonction de la nullité des colonnes au fil du temps, les vues ne seront pas identiques et que tout code qui les référencent peut également se casser. Si vous avez besoin de laisser tomber et de recréer une vue souvent, la vue ne servait pas son but. Cela dit, l'automatiser en une partie avec A_T_C n'est pas tout mal.


@BC: Je suis d'accord avec vous à peu près tout. J'imagine cette op, ayant hérité d'un héritage, une table monolithique avec quelques centaines de colonnes, dont la plupart sont principalement nuls, et peut-être 20 types, et qui souhaitent une sorte de raccourci moyen de générer des rapports sur cette table. Il se peut facilement être que certains des cols qui sont nuls pour chaque rangée (pour certains types) n'auront jamais de valeurs (les cols sont complètement non pertinents pour ces types - de sorte que les vues ne changeraient pas). Ce qu'il demande n'est pas vraiment pratique, mais le faire manuellement serait un pita aussi.


@Gerrat vous êtes correct. J'ai hérité d'un dB hérité avec une structure de table qui ne convient pas bien pour BI. Je suis chargé de créer un nouveau schéma plus simple. Donc, votre commentaire sur "Donne-moi les noms de colonnes des colonnes pour lesquelles chaque ligne de cette colonne est null, pour un type particulier". est tache sur. J'espérais pouvoir créer une vue pour chacun des 4 types que cette table fait, sans obtenir tout le fouillis, mais cela semble presque trop travailler.


La bonne nouvelle est que cela ne changera pas avec le temps. Si je détermine que mon type A utilise 25 colonnes, elle n'utilisera pas de 20 ou 38 ans. Il va rester à 25.



0
votes

Après avoir regardé @gerrat et les commentaires de @ BQ, je pourrais avoir les détails dont j'ai besoin de la manière suivante: j'ai une table héritée qui a n de types différents. Tous les types partagent des colonnes et ont des colonnes exclusives.

Je peux créer une vue pour chaque type avec toutes les colonnes, puis utilisez all_tab_columns pour obtenir tous les noms de colonnes où le "Num_Nulls" est inférieur au nombre total de lignes pour ce type spécifique.

De là, il doit être facile de rassembler des colonnes utilisées pour chaque type et de créer les vues.

pensées?


0 commentaires

3
votes
select * from nulls_per_type;

COL_1 is always 0 for b
COL_3 is always 0 for a
COL_3 is always 0 for b

3 commentaires

C'est standard SQL, pas seulement Oracle. Vous pouvez également faire: SELECT Count (COL_1), COUNT (COL_2), COUNT (COL_3) [...] à partir de quelque chose de même à compter (*)> 0 et (COULE_1) = 0 ou Compte (Col_2) = 0 ou comptage (col_3) = 0 . Qui ignore toutes les tables vides et ne renvoie rien si au moins une des colonnes testées ne contient que des nulls.


Ma table a plus de 300 colonnes. Je ne veux pas compter sur chaque 300 fois.


Je ne veux pas de disques de ma table d'origine. Ce dont j'ai besoin est une liste de noms de colonnes de ma table où tous les enregistrements d'un type spécifique n'ont que des valeurs null.



0
votes

Je pense que vous pouvez résoudre ce problème en utilisant MetaProgramming. Utilisez un curseur pour boucle à travers chaque type et colonne, et utilisez-le pour vérifier si la colonne est vide. Par exemple: xxx

excuses s'il y a une erreur dans la syntaxe quelque part, je n'ai rien à vérifier sur.


0 commentaires

16
votes
SELECT  t.column_name
FROM    user_tab_columns t
WHERE   t.nullable = 'Y'
        AND t.table_name = 'YOUR_TABLE_NAME'
        AND t.num_distinct = 0

1 commentaires

Je devais exécuter les statistiques d'abord dbms_stats.gather_database_stats (); et puis cela a fonctionné comme un charme! Merci ;)



-1
votes
SELECT tablecolumn, tablecolumn2, ... FROM TABLENAME
WHERE column IS NOT NULL

0 commentaires

0
votes

Vous pouvez identifier à l'aide de la requête ci-dessous:

delete from
(select ascii(t.col2)+ascii(t.col4)+ascii(t.col1)+ascii(t.col3) col from test_null_col t)
where col is null;


0 commentaires

0
votes

Pour trouver des lignes qui ont une valeur nulle, utilisez la condition " NULL STRAR>".

select * from table_A where table_col1 < 15 or table_col1 is null;


0 commentaires