2015-10-15 11 views
0

此語法不起作用:如何將表中每列的默認值?

select nvl(student.*,0) 
from student ; 

如何申請一個NVL()函數在STUDENT表的每一列?

+0

可以指定你的問題嗎?你想選擇空值還是插入? – Tatiana

+0

like [this](http://stackoverflow.com/questions/26064254/select-all-columns-except-null-or-nvl-all-null)? – SomeJavaGuy

+0

爲什麼你會在所有列中放置空值? – brenners1302

回答

3

我們不能那樣做。我們需要輸出所有列和它們各自的NVL()函數。我知道這似乎是一個很大的努力,但考慮如果您的任何列是DATE或其他「異國情調」的數據類型會發生什麼。

如果你有很多的列和你真的想省力你可以生成從數據字典中的條款:

select 'nvl('|| column_name || ', 0)' 
from user_tab_columns 
where table_name = 'STUDENT' 
order by column_id; 

Cut'n'paste結果集到一個編輯器。

一旦你開始在這條路線很容易變得更加複雜:

select case when column_id > 1 then ',' end || 
     'nvl('|| column_name || ',' || 
     case when data_type = 'DATE' then 'sysdate' 
      when data_type = 'VARCHAR2' then '''DEF''' 
      else '0' end || 
     ')' 
from user_tab_columns 
where table_name = 'STUDENT' 
order by column_id; 
0

大概是這樣的(如果你是11克),如果你打算寫一個PL/SQL,要不然只是dbms_output.put_line變量l_query,讓您的查詢和執行它 -

這會給你使用NVL所有列查詢 -

SELECT 'SELECT '|| listagg ('nvl('||column_name, ',0),') 
          WITHIN GROUP (ORDER BY column_name) ||',0) FROM TABLE1' 
    FROM all_tab_columns 
    WHERE table_name='TABLE1'; 

這裏面PL實現/ SQL的

DECLARE 
    v_record table1%rowtype; 
BEGIN 
    SELECT 'SELECT '|| listagg ('nvl('||column_name, ',0),') 
           WITHIN GROUP (ORDER BY column_name) ||',0) FROM TABLE1' 
    INTO l_query 
    FROM all_tab_columns 
    WHERE table_name='TABLE1'; 

    l_query := l_query ||' WHERE rownum<=1000'; --add where clause if you want to 

    OPEN tab_cursor FOR l_query; 
    LOOP 
    FETCH tab_cursor INTO v_record; 
    EXIT WHEN tab_cursor%NOTFOUND; 
    END LOOP; 

    --Do something with v_record 
END; 
/
相關問題