自定义SQL查询

时间:2014-07-04 16:48:36

标签: sql oracle

我要求在哪里动态创建一个表(列数可能会根据我创建此表的过程的输入参数而改变),表格中的数据如下所示。

PK col1 col2 col3
A  null 1-2  3-4
B  null null  4-5
C  null 5-6  null

现在要求是我只想提取至少应该有1个记录而没有null的列,并将整个数据假脱机到一个文件中。我的输出应该如下所示(col1从输出中排除,因为它具有所有空值)。

PK col2 col3 
A  1-2  3-4
B  null  4-5
C  5-6  null

任何人都可以提供任何提示来实现这一目标。提前谢谢。

3 个答案:

答案 0 :(得分:0)

我怀疑这不会非常有效,但您可以使用COUNT()来确定列中是否只有NULLS,因为COUNT(column_here)只会为每个非空值添加1。因此,如果计数为零,则该列仅为NULL。

然后可以将它组合成一个查询以生成一个有效的select语句,然后立即执行(当然要注意避免sql注入)。

无论如何,这是一个例子:

select
     'select '
   || substr((
        select
                 case when count(COL1) > 0 then ',col1' else '' end
              || case when count(COL2) > 0 then ',col2' else '' end
              || case when count(COL3) > 0 then ',col3' else '' end
        from a_table
       ),2,8000)
   || ' from '
   || ' a_table'
   as sql_string
from dual
;

请参阅this sqlfiddle

以上结果是:

|                     SQL_STRING |
|--------------------------------|
| select col2,col3 from  a_table |

答案 1 :(得分:0)

这是一个尝试。首先,创建一个函数来生成查询,返回REF CURSOR:

create or replace function select_non_nulls() return sys_refcursor as
  myQuery varchar2(500);
  myCur   sys_refcursor;
begin

  select 'select ' || listagg(col, ', ') within group (order by col) || ' from test'
  into myQuery
  from
  (
    select case when max(col1) is null then null else 'col1' end col from test
    union all
    select case when max(col2) is null then null else 'col2' end col from test
    union all
    select case when max(col3) is null then null else 'col3' end col from test
  )
  ;

  open myCur for myQuery;

  return myCur;

end;
/

然后在SQL * Plus中使用它:

SQL> var rc refcursor
SQL> exec :rc := select_non_nulls;
SQL> print rc;

答案 2 :(得分:0)

我使用了all_tab_cols中的num_nulls,并根据我的要求获得了结果。谢谢。