此语法不起作用:
select nvl(student.*,0)
from student ;
如何将NVL()函数应用于STUDENT表中的每一列?
答案 0 :(得分:3)
我们无法做到这一点。我们需要输入所有列及其各自的NVL()函数。我知道这似乎需要付出很多努力但是如果您的任何专栏都是DATE或其他一些"异国情调"那么请考虑会发生什么。数据类型。
如果你有很多专栏并且你真的想省力,你可以从数据字典中生成条款:
select 'nvl('|| column_name || ', 0)'
from user_tab_columns
where table_name = 'STUDENT'
order by column_id;
剪切并将结果集粘贴到编辑器中。
一旦你开始这条路线,它就会变得更加复杂:
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;
答案 1 :(得分:0)
可能是这样的(如果你在 11g ),如果你打算写一个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;
/