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;
我知道我可以使用游标创建一个脚本,然后循环遍历,将结果添加到新表或视图中。 这不是我所需要的。我想知道是否可以使用单个查询,使用数据透视/取消数据透视或其他方法完成此操作。
答案 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表中获得了预期的结果。