【问题标题】:List columns of table on which there is at least one row with a non null value for a specific query列出特定查询的至少有一行具有非空值的表的列
【发布时间】:2018-09-07 12:04:13
【问题描述】:

我正在尝试找到正确的查询:

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

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

我希望我已经足够清楚了。

【问题讨论】:

  • 你的意思是你想要列名吗? (或列值?)
  • @jarlh 想获取列名以查看哪一列对我的查询没有价值
  • 添加一些示例表数据和预期结果 - 全部作为格式化文本,而不是图像。同时向我们展示您当前的查询尝试。
  • 我正在尝试找出一种通用方法来在几张桌子上执行此操作。我猜这可能会使用user_tab_columns table 来完成

标签: sql oracle


【解决方案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 动态生成此查询。

【讨论】:

    【解决方案2】:

    请在下面的匿名块中查看您的情况,表名应在以下查询中的 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;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-10-20
      • 2018-12-08
      • 2011-11-23
      • 1970-01-01
      • 1970-01-01
      • 2021-12-12
      • 1970-01-01
      相关资源
      最近更新 更多