Non penso che questo possa essere fatto in una singola query. Potresti aver bisogno di un plsql per testare prima quali colonne contengono dati e mettere insieme una dichiarazione basata su tali informazioni. Ovviamente, se i dati nella tua tabella cambiano devi ricreare la dichiarazione.
declare
l_table varchar2(30) := 'YOUR_TABLE';
l_statement varchar2(32767);
l_test_statement varchar2(32767);
l_contains_value pls_integer;
-- select column_names from your table
cursor c is
select column_name
,nullable
from user_tab_columns
where table_name = l_table;
begin
l_statement := 'select ';
for r in c
loop
-- If column is not nullable it will always contain a value
if r.nullable = 'N'
then
-- add column to select list.
l_statement := l_statement || r.column_name || ',';
else
-- check if there is a row that has a value for this column
begin
l_test_statement := 'select 1 from dual where exists (select 1 from ' || l_table || ' where ' ||
r.column_name || ' is not null)';
dbms_output.put_line(l_test_statement);
execute immediate l_test_statement
into l_contains_value;
-- Yes, add column to select list
l_statement := l_statement || r.column_name || ',';
exception
when no_data_found then
null;
end;
end if;
end loop;
-- create a select statement
l_statement := substr(l_statement, 1, length(l_statement) - 1) || ' from ' || l_table;
end;
La tua domanda è abbastanza poco chiaro. Come scritto, sembra che tu stia chiedendo di SELEZIONARE * tutte * le righe da un tavolo? E 'davvero quello che cerchi? O intendi includere una clausola WHERE e SELEZIONA solo le righe che contengono valori non NULL nelle colonne di interesse? O vuoi selezionare tutte le colonne che non sono nulle per tutte le righe? Potresti spiegarlo per favore? –
Trovo la domanda abbastanza chiara. Vuole selezionare solo le colonne per le quali almeno una riga contiene dati. Avere una clausola WHERE renderebbe questo ancora più difficile, ovviamente. – Thilo
cosa ti piacerebbe fare con i dati? dove sarà usato? – shahkalpesh