Oracle: Finden von Spalten mit nur Nullwerten
Ich habe eine Tabelle mit vielen Spalten und eine Spalte "Typ".
Einige Spalten zu sein scheinen immer leer, für einen bestimmten Typ.
Möchte ich eine Ansicht erstellen, für jeden Typ und zeigen nur die relevanten Spalten für jeden Typ. Unter der Annahme, dass, wenn eine Spalte NUR null-Werte für einen bestimmten Typ, dann, dass Spalten, die nicht Teil der Sicht, wie kann man mit Abfragen?
Gibt es eine
SELECT [Spaltenname] FROM [Tabelle] WHERE [columnValues] SIND ALLE [null]
Ich weiß, dass ich KOMPLETT alles bis oben... ich versuche nur auf die Idee kommen über.
Vielen Dank im Voraus!
Also, wenn Sie über 50 Spalten und 10 von Ihnen enthalten nur NULL-Werte, Sie wollen eine Abfrage, die nur die Rückkehr des 40-Spalten, die tatsächlich mit Daten? Und vermutlich, wenn einer der anderen 10 erwirbt einen Wert, deine query würde dann wieder 41 Spalten?
Es klingt wie Sie haben verschiedene "Arten" oder "Arten" der Datensätze in der gleichen Tabelle, wo Sie gerne eine eigene Ansicht für jede. Gibt es eine Spalte, in der die Identität der "Typ" der Eintrag?
Ja das ist richtig @CodeByMoonlight.
Ja @Adam Hawkes. Ich habe eine Spalte namens "Type", und ich möchte eine Ansicht erstellen, für jede einzelne ein, während das entfernen Sie alle Unordnung.
Es klingt wie Sie haben verschiedene "Arten" oder "Arten" der Datensätze in der gleichen Tabelle, wo Sie gerne eine eigene Ansicht für jede. Gibt es eine Spalte, in der die Identität der "Typ" der Eintrag?
Ja das ist richtig @CodeByMoonlight.
Ja @Adam Hawkes. Ich habe eine Spalte namens "Type", und ich möchte eine Ansicht erstellen, für jede einzelne ein, während das entfernen Sie alle Unordnung.
InformationsquelleAutor Jorge Valois | 2011-01-07
Du musst angemeldet sein, um einen Kommentar abzugeben.
DBMS_STATS.gather_database_stats();
und dann diese funktionierte wie ein Charme! Danke 😉InformationsquelleAutor Fer Lopez
gibt an, wie viele Datensätze pro Spalte eine nicht-null-Wert (zumindest in Oracle, das ist.)
Beispielsweise
gibt
darauf hinweist, dass col_3 besteht aus Nullen nur.
Diese Idee kann dann verwendet werden zum erstellen der gewünschten Ansicht.
Den Tisch muss nun auch die *group_id*:
Welche, wenn Sie ausgewählt ist zurück:
SELECT COUNT(col_1), COUNT(col_2), COUNT(col_3) [...] FROM SomeTable HAVING COUNT(*) > 0 AND (COUNT(col_1) = 0 OR COUNT(col_2) = 0 OR COUNT(col_3) = 0
. Ignoriert, dass alle leeren Tabellen und gibt nur etwas, wenn mindestens einer der getesteten Spalten nur Nullen.Meine Tabelle über 300 Spalten. Ich will nicht zu zählen, jede 300-mal.
Ich will nicht alle Datensätze aus meiner ursprünglichen Tabelle. Was ich brauche, ist eine Liste der Spaltennamen aus meiner Tabelle, wo alle Einträge für einen bestimmten Typ haben nur null-Werte.
InformationsquelleAutor René Nyffenegger
Nach einem Blick auf @Gerrat und @BQ Kommentare, ich thouht, ich könnte die details brauche ich in der folgenden Weise: ich habe eine legacy-Tabelle, die hat N verschiedene Arten. Alle Arten teilen, Spalten, und haben exklusive Spalten.
Kann ich eine Ansicht erstellen, die für jede Art mit allen Spalten, dann verwenden Sie all_tab_columns, um alle Spaltennamen, wo die "num_nulls" kleiner ist als die Gesamtzahl der Zeilen, die für diesen bestimmten Typ.
Von dort aus ist es sollte leicht zu sammeln Spalten, die verwendet werden für jede Art und erstellen der views.
Gedanken?
InformationsquelleAutor Jorge Valois
Ich denke, Sie können dies lösen, mit metaprogramming. Verwenden Sie einen cursor, um eine Schleife durch jedes Typ und Spalte, und verwenden Sie dann 'nicht vorhanden' zu überprüfen, ob die Spalte leer ist. Zum Beispiel:
Entschuldigt, wenn es ein Fehler in der syntax irgendwo, ich habe nichts, um dies zu überprüfen.
InformationsquelleAutor dataduck
Können Sie identifizieren, indem Sie mithilfe der folgenden Abfrage :
select * from (select ascii(t.col2)+ascii(t.col4)+ascii(t.col1)+ascii(t.col3) col aus test_null_col t)
wo col is null;
Und Sie löschen möchten null-Spalte Zeilen hier ist die Abfrage :
löschen aus
(select ascii(t.col2)+ascii(t.col4)+ascii(t.col1)+ascii(t.col3) col aus test_null_col t)
wo col is null;
InformationsquelleAutor Mutturaj
Sowas?
Offensichtlich, die Sie verwenden können, in einem
CREATE VIEW...
- Anweisung, wenn Sie wie auch.Oracle hat kein Konzept für eine
ALL
Schlüsselwort in der condition-Klausel einerSELECT
(siehe download.oracle.com/docs/cd/B13789_01/server.101/b10759/...). Wenn @Jorge erstellen möchte, verschiedene Ansichten für jeden 'Typ', die er braucht, um festzustellen, ob der 'Typ' ist basiert auf einer Diskriminator-Spalte oder durch die Anwesenheit von bestimmten null-Spalten werden für alle Datensätze dieses Typs. Er scheint eine Verwechslung der beiden Methoden.Das ist nicht etwa ein mystisch
ALL
Schlüsselwort. Es geht darum, was der OP versucht zu bekommen. Ich denke, wenn Sie re-Lesen Sie, was er sucht, es ist ziemlich klar aus dem Kontext, dass das, was er nach dem ist im Grunde: "Gib mir die Spalte die Namen der Spalten, für die in JEDER Zeile der Spalte null ist, für einen bestimmten Typ." ..., damit Ihre sql-Zeilen zurückgibt, anstelle von Spaltennamen, und die Zeilen gibt es nicht wirklich, uns näher zu wissen, wenn JEDE Zeile, Spalte ist NULL. Es ist einfach der RÜCKFÜHRUNG Zeilen, in denen (jede Spalte in einer bestimmten Gruppe von Spalten) NULL istEine Möglichkeit, das zu tun, was op ist zu Fragen, könnte sein, eine gespeicherte Prozedur, die: 1. Verschiedene Werte für die
type
col; 2. Lesen Sie die Spaltennamen aus einer Metadaten-Tabelle wie all_tab_columns; 3. Alle Spalten, die hatten alle nicht-null-Werte für jede Art; 4. Erstellt eine Ansicht für die einzelnentype
Verwendung von dynamischem sql, und die Spalten von (3). ...ein gutes Stück Arbeit,Ich Stimme mit Ihnen auf so ziemlich alles. Ich Stelle mir vor dieser OP, nachdem Sie geerbt ein Vermächtnis, monolithischer Tisch mit ein paar hundert Spalten, von denen die meisten sind meist null, und vielleicht 20 Typen, und wollen irgendeine Art von
shortcut
Weg zu erzeugen, einige Berichte auf dieser Tabelle. Es könnte leicht sein, dass einige der Spalten, die null-Werte für jede Zeile (für bestimmte Arten) niemals Werte (die Spalten sind völlig irrelevant für diese Typen, so die Meinung nicht ändern würde). Was er fordert ist nicht wirklich praktisch, aber es manuell zu tun wäre ein PITA, wie gut.InformationsquelleAutor BQ.
WÄHLEN Sie tablecolumn, tablecolumn2, ... FROM TABELLENNAME
WHERE column IS not NULL
InformationsquelleAutor isreal Obaro