SQL-从并非所有值都为null的表中仅获取列

时间:2018-09-20 11:57:55

标签: sql oracle

SQL问题: 如何从并非所有值都为空的列中获取所有列的值?

表A

COL1    COL2    COL3    COL4    COL5
---------------------------------------
abc     1       NULL    NULL    NULL
def     2       NULL    testA   NULL
NULL    3       NULL    testB   NULL
jkl     4       NULL    NULL    NULL

我想得到

COL1    COL2    COL4    
-----------------------
abc     1       NULL    
def     2       testA   
NULL    3       testB   
jkl     4       NULL    

是否存在sql或plsql解决方案来实现这一目标? 为了避免不相关的答案:假设我有一百万行。 我希望结果是视图或结果表。 不是书面输出。

我发现了一个类似的问题,但不能满足我的需要: How to select columns from a table which have non null values?

可以通过此查询快速获取列名

select column_name 
from all_tab_columns 
where lower(table_name)='tableA' and num_distinct > 0;

我知道我可以使用游标创建一个脚本,然后循环遍历,将结果添加到新表或视图中。 这不是我所需要的。我想知道是否可以使用单个查询,使用数据透视/取消数据透视或其他方法完成此操作。

2 个答案:

答案 0 :(得分:1)

您所要求的内容在普通SQL中是不可能的,除非您提前知道哪些列到处都只有NULL。 (看来您不想假设您知道这一点。)

输出中包括哪些列-多少列,它们的名称以及它们出现的顺序-必须在SELECT子句中进行硬编码,无法在运行时确定。另一方面,只有在读取数据后(即在运行时),您才知道哪些列为全空-否则您必须从外部来源获得该信息。

做您想做的唯一方法是使用动态SQL 。这是一个高级主题,通常被认为是不良的商业惯例。

为什么不想显示全空值的列?您确定该要求有意义吗?

答案 1 :(得分:0)

尝试这些步骤,可能会有所帮助:

Create table temp as (Select * from TableA)

Declare NbrRows Number(10);
plsql_block VARCHAR2(1000);
CountNullRows Number (10)

Select count(*) as nbr 
into NbrRows
from TableA

Select count(COL1) as nbr
into CountNullRows
from TableA where COL1 is null

if (NbrRows = CountNullRows) then
Alter table Temp drop column COL1
endif

Select count(COL2) as nbr
into CountNullRows
from TableA where COL2 is null

if (NbrRows = CountNullRows) then
Alter table Temp drop column COL2
endif

Select count(COL3) as nbr
into CountNullRows
from TableA where COL3 is null

if (NbrRows = CountNullRows) then
Alter table Temp drop column COL3
endif

...etc...

对所有列执行相同的操作

您在Tem表中获得了预期的结果。