Alle Spalten, die not Null sind ausgeben

Hallo,

folgendes Problem. Ich habe eine Tabelle mit ziemlich viel Spalten. Ich möchte jetzt bei meinen Abfragen nur die Spalten, die mit „is not null“ gefüllt sind, weil ich sie dann später nach Excel exportieren muss. Je nach Abfrage sind das unterschiedliche Spalten.

Hat jemand eine Idee? Ich habe auch schon mal alle Spalten in eine txt-Datei geschrieben und versucht mit UE die Spalten zu löschen, aber da komme ich mit den Überschriften nicht klar.

Grusz
Alb

Hallo Albert,

folgendes Problem. Ich habe eine Tabelle mit ziemlich viel
Spalten. Ich möchte jetzt bei meinen Abfragen nur die Spalten,
die mit „is not null“ gefüllt sind, weil ich sie dann später
nach Excel exportieren muss. Je nach Abfrage sind das
unterschiedliche Spalten.

versuch mal das hier:

SELECT * FROM Tabelle
WHERE (NOT(Spalte1 IS NULL)) OR (NOT(Spalte2 IS NULL)) OR (NOT(Spalte3 IS NULL))

Das gibt alle Spalten (*) von „Tabelle“ zurück, wo in Spalte1, Spalte2 oder Spalte3 etwas drinsteht.

MfG
Stephan

Hi Stephan,

Danke für den Vorschlag, aber ich suche einen select, wo ich auch nur die Spalten zurückbekomme, in denen etwas drinsteht. Also z. B. steht nur in Spalte1 etwas, dann möchte ich nur Spalte1 in meinem select haben.

SELECT Spalte1 FROM Tabelle
WHERE (NOT(Spalte1 IS NULL)) OR (NOT(Spalte2 IS NULL)) OR
(NOT(Spalte3 IS NULL))

und wenn in Spalte2 und Spalte3 etwas drinsteht, möchte ich nur die haben:

SELECT Spalte2, Spalte3 FROM Tabelle
WHERE (NOT(Spalte1 IS NULL)) OR (NOT(Spalte2 IS NULL)) OR
(NOT(Spalte3 IS NULL))

Ich habe mir schon überlegt, ob dich die ALL_TAB_COLUMNS anzapfe, aber da bin ich nicht so richtig weiter gekommen. Ich benutze SQL Developer und TOAD, vielleicht haben die beiden auch irgendein Feature mit dem so etwas einfach gemacht werden kann.

Nochmals Danke und Gruß Alb

Moin, Albert,

SQL lässt sich nicht dazu missbrauchen, Tabellen strukturen zu ändern - und das, was Du da bauen willst, ist halt keine Tabelle oder View. Vermutlich kommst Du schneller ans Ziel, wenn Du die Tabellen in eine Textdatei exportierst und dann mit einer Skriptsprache die leeren Spalten verschwinden lässt.

Gruß Ralf

Hallo Albert,

… aber ich suche einen select, wo ich
auch nur die Spalten zurückbekomme, in denen etwas drinsteht.

Suchst Du Spalten, die als NOT NULL definiert sind oder auch Spalten, die als NULL definiert sind, aber in denen Spaltenwerte gespeichert sind? Für den ersten Fall könnte folgendes Beispiel weiterhelfen.

DROP TABLE demotab;

DECLARE
 -- Tabellennamen einsetzen
 tabname VARCHAR2(4000) := 'MeineTabelle'; 

 -- Cursor liefert alle Spalten zu Tabelle, die NOT NULL sind
 CURSOR notNullCols (tabname varchar2) IS
 SELECT column\_name FROM user\_tab\_columns 
 WHERE table\_name = tabname and nullable = 'N';

 colname VARCHAR2(4000);
 collist VARCHAR2(4000) := '';

 -- Ergebnis soll in Tabelle geschrieben werden
 abfrage VARCHAR2(4000) := 'CREATE TABLE demotab AS ';

BEGIN
 -- Spaltenliste zusammensetzen
 OPEN notNullCols (upper(tabname));
 LOOP
 FETCH notNullCols into colname;
 EXIT WHEN notNullCols%NOTFOUND;
 collist := collist || colname || ',';
 END LOOP;
 CLOSE notNullCols;

 -- SQL-Anweisung ausfuehren
 IF length(collist) is not null THEN
 collist := substr(collist,0,length(collist)-1);
 abfrage := abfrage || 'SELECT ' || collist || ' FROM ' || tabname;
 EXECUTE IMMEDIATE abfrage;
 END IF;
END;
/

-- Ergebnis auslesen
SELECT \* FROM demotab;

Peter

1 Like

Hi, die Lösung sieht echt super aus. Ich habe zwar noch nie was mit CURSORs gemacht, aber es gibt ja für alles ein erstes Mal, :wink:.

thanx und Gruß
Alb

verketten ?
Wenn es Spalten vom Datentyp String sind dann könnte man sie verketten :

select Spalte1 || Spalte2 || Spalte3 from table