日期:2014-05-17  浏览次数:20910 次

请教如何查询一个表中有哪些列全为空
各位达人,

请教一个问题。

假设现在有一个表 table1, 共有 10列,全是 INT型。

create table table1
(col_1 INT,
 col_2 INT,
 col_3 INT,
 col_4 INT,
 col_5 INT,
 col_6 INT,
 col_7 INT,
 col_8 INT,
 col_9 INT,
 col_10 INT)

这个表的记录的插入规则是

先插入若干记录, 这些记录在第 10列 col_10 有值,但是在其他列为空值;
再插入若干记录,这些记录在第 10列 col_10 和第 9列 col_9有值,但是在其他列为空值;
再插入若干记录,这些记录在第 10列 col_10,第 9列 col_9 和 第 8列 col_8有值,但是在其他列为空值;
...

请问我可以用一个什么样的 sql语句,来判断某一个时刻这个表中全为空的列的列名是哪些?

这里全为空的意思是:这个表中的所有记录在这一列的值都为空值

万分感谢!

------解决方案--------------------
这样可以?
SQL code
CREATE TABLE test(a NUMBER(5),b NUMBER(5),c NUMBER(5));
INSERT INTO test VALUES (100,NULL,null);
INSERT INTO test VALUES (null,200,null);
INSERT INTO test VALUES (300,NULL,null);
COMMIT;

SELECT column_name FROM 
(
  SELECT 'A'column_name,Max(Length(a))column_len FROM test UNION ALL 
  SELECT 'B'column_name,Max(Length(b))column_len FROM test UNION ALL 
  SELECT 'C'column_name,Max(Length(c))column_len FROM test 
)WHERE column_len IS NULL;

------解决方案--------------------
怕是要用PL/SQL哦
这样是否可以:
SQL code
DECLARE 
CURSOR temp IS SELECT COLUMN_NAME FROM ALL_TAB_COLUMNS WHERE TABLE_NAME=Upper('TEST');
v_num NUMBER;
BEGIN
  FOR i IN temp 
  LOOP
    execute immediate 'SELECT Count(*) FROM test WHERE '||i.COLUMN_NAME||' IS NOT null' INTO v_num; 
    IF v_num=0 THEN 
      Dbms_Output.put_line('==columns that have no data=='||i.COLUMN_NAME);
    END IF; 
    NULL; 
  END LOOP;
END;