簡體   English   中英

列出至少有一行針對特定查詢的具有非空值的表的列

[英]List columns of table on which there is at least one row with a non null value for a specific query

我試圖找到合適的查詢:

獲取表的所有列名,該表至少有一行針對特定查詢具有非空值。

含義:我將查看給定查詢返回的記錄中哪些列設置了至少一個值。

我希望我足夠清楚。

我認為您需要以下物品:

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如前所述動態生成此查詢。

請檢查下面的匿名塊是否適合您的情況,表名應在以下查詢的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;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM