Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

[Oracle] Abfrage über leere Spalten

278 views
Skip to first unread message

milan chrobok

unread,
Aug 15, 2001, 9:37:24 AM8/15/01
to
Hi,
ich will wissen welche Spalten in meiner Datenbank in allen Datensätzen
nur null values enthalten, wie mache ich dies ?

Danke,

Matthias (Newbie auf dem Gebiet)

P.S. also mit sqlplus das ganze

Michael Rieken

unread,
Aug 15, 2001, 9:55:11 AM8/15/01
to
Am Wed, 15 Aug 2001 15:37:24 +0200, hat milan chrobok <milan....@bln1.siemens.de>
geschrieben:
> Hi,
> ich will wissen welche Spalten in meiner Datenbank in allen Datens=E4tzen=
>
> nur null values enthalten, wie mache ich dies ? =
>
WHERE <Spalte> IS NULL

MfG Michael

milan chrobok

unread,
Aug 15, 2001, 10:36:23 AM8/15/01
to

Kathinka Diehl wrote:


>
> milan chrobok <milan....@bln1.siemens.de> wrote:
>
> > ich will wissen welche Spalten in meiner Datenbank in allen Datensätzen
> > nur null values enthalten, wie mache ich dies ?
>

> select count(*)
> from tabelle
> where spalte1 is null
> and spalte2 is null
> ...

Hmmm...,
anscheinend meine Frage falsch gestellt.
Ich möchte eine Abfrage machen die mir alle Spalten(namen) liefert, in
denen _nie_ ein Wert steht sondern immer nur null. Quasi alle völlig
unbenutzten Spalten.

Danke,
Matthias (ich weiss anderer Name bei der Mail...)

Wolfgang Hänsch

unread,
Aug 15, 2001, 10:51:04 AM8/15/01
to
milan chrobok schrieb:

>
> Hmmm...,
> anscheinend meine Frage falsch gestellt.
> Ich möchte eine Abfrage machen die mir alle Spalten(namen) liefert, in
> denen _nie_ ein Wert steht sondern immer nur null. Quasi alle völlig
> unbenutzten Spalten.
>
für Oracle 8:
select * from user_tab_col_statistics
where num_distinct = 0

Gruss
Wolfgang

Klaus Zeuch

unread,
Aug 15, 2001, 11:24:15 AM8/15/01
to
Hallo,

mit 8i und unter einem user mit dba-Berechtigung in SQL*Plus und mit sehr,
sehr viel Geduld z.B. mit

set serveroutput on
declare
l_col number := 0;
l_row number := 0;
begin
for l_c in (select owner, table_name, column_name
from dba_tab_columns)
loop
execute immediate 'select count(*) from ' ||
l_c.owner || '.' ||
l_c.table_name ||
' where ' || l_c.column_name
|| ' is null' into l_col;
execute immediate 'select count(*) from ' ||
l_c.owner || '.' ||
l_c.table_name into l_row;
if l_row = l_col then
dbms_output.put_line('Treffer fuer ' || l_c.owner || '.' ||
l_c.table_name || ', Spalte ' || l_c.column_name);
end if;
end loop;
end;
/

Da dabei aber auch alle Systemtabellen von Oracle durchpflügt werden (und
das sind einige !), ist es empfehlenswerter, das für jedes gewünschte Schema
(= user mit Objekten) zu tun, dann ist anstelle

for l_c in (select owner, table_name, column_name
from dba_tab_columns)

statt dessen

for l_c in (select owner, table_name, column_name
from dba_tab_columns where owner =
upper('name_des_gewuenschten_users'))

zu verwenden.

Disclaimer: Keine Garantie für die Richtigkeit der Lösung!

Klaus


Klaus Zeuch

unread,
Aug 15, 2001, 11:58:31 AM8/15/01
to
Die Abfrage ist nur dann korrekt, wenn vorher ein ANALYZE auf die Tabellen
lief und danach keine Änderungen am Datenbestand vorgenommen werden. Wenn
diese Bedingung nicht erfüllt ist, liefert die Abfrage falsche Aussagen:

SQL> create table test1(a varchar2(1));
SQL> insert into test1 values ('X');
SQL> commit;
SQL> select num_nulls from user_tab_columns where table_name = 'TEST1';
NUM_NULLS
----------

SQL> select num_distinct from user_tab_columns where table_name = 'TEST1';
NUM_DISTINCT
------------

SQL> analyze table test1 compute statistics;
SQL> select num_nulls from user_tab_columns where table_name = 'TEST1';
NUM_NULLS
----------
0
SQL> select num_distinct from user_tab_columns where table_name = 'TEST1';
NUM_DISTINCT
------------
1
SQL> update test1 set a = null;
SQL> commit;
SQL> select num_distinct from user_tab_columns where table_name = 'TEST1';
NUM_DISTINCT
------------
1


Klaus


0 new messages