列出至少有一行针对特定查询的具有非空值的表的列

时间:2018-09-07 12:04:14

标签: sql oracle

我正在尝试寻找合适的查询:

  

获取一个表的所有列名,该表至少有一行针对特定查询具有非空值。

含义:我将查看给定查询返回的记录中哪些列设置了至少一个值。

我希望我足够清楚。

2 个答案:

答案 0 :(得分:1)

我认为您需要以下物品:

SELECT CASE WHEN MAX(col1) IS NOT NULL THEN 'COL1' END ||','
    || CASE WHEN MAX(col2) IS NOT NULL THEN 'COL2' END ||','
    ...
  FROM T

然后使用REGEXP_REPLACE替换重复的,。您可以使用user_tab_columns来动态生成此查询。

答案 1 :(得分:0)

请检查以下匿名块是否符合您的情况,表名应在以下查询的3个地方给出

Declare
v_columnlist varchar2(32627);
v_noofcolumns number;
Columnnm  varchar2(1000);
Finalcolumns varchar2(32627);
v_count  number:=0;
plsql_block varchar2(32627);

Begin

select LISTAGG(column_name,',') within group (order by column_id),max(column_id) 
into v_columnlist , v_noofcolumns
from user_tab_columns 
where table_name='tablename';

FOR Lcntr IN 1..v_noofcolumns
LOOP

select REGEXP_SUBSTR(v_columnlist,'[^,]+',1,Lcntr)
into Columnnm
from dual;

plsql_block := 'select count(*)  from tablename  where '|| Columnnm || ' is not null ';

EXECUTE IMMEDIATE plsql_block into v_count;

IF v_count > 1 THEN 
Finalcolumns:= LTRIM(Finalcolumns ||','||Columnnm,',');

END IF;

END LOOP;

plsql_block := 'select ' || Finalcolumns ||' from tablename ';

DBMS_OUTPUT.PUT_LINE(plsql_block);

END;